【问题标题】:Python Thrift RPC Not working on EC2Python Thrift RPC 不适用于 EC2
【发布时间】:2011-09-21 02:51:02
【问题描述】:

我正在尝试使用 Thrift 创建一个简单的客户端/服务器应用程序,它将在 EC2 上运行。

我创建的示例非常适合 localhost,但是当我尝试在 ec2 上的两台不同机器上进行 RPC 调用(两台机器都有单独分配的弹性 IP 地址)时,它无法正常工作,并出现以下错误:

raceback (most recent call last):
  File "SocialQClient.py", line 25, in <module>
    transport.open()
  File "/usr/local/lib/python2.6/dist-packages/thrift/transport/TTransport.py", line 150, in open
    return self.__trans.open()
  File "/usr/local/lib/python2.6/dist-packages/thrift/transport/TSocket.py", line 90, in open
    raise TTransportException(type=TTransportException.NOT_OPEN, message=message)
thrift.transport.TTransport.TTransportException: Could not connect to <MY-ELASTIC-IP>:9090

我在两台机器上都为 TCP 端口 9090 设置了 0.0.0.0/0 的安全组。我也尝试了UDP,但没有解决。我做错了什么?

更新:

【问题讨论】:

    标签: python facebook amazon-ec2 thrift


    【解决方案1】:

    我冒险猜测,当您的一个 ec2 实例(“node1”)尝试对另一个 ec2 实例(“node2”)进行 RPC 调用时,node2 会返回其内部 IP 地址。

    参考 - http://alestic.com/2009/06/ec2-elastic-ip-internal

    引用:

    最后一个选项使用弹性 IP 地址的一个鲜为人知的功能 由 Amazon EC2 实现的系统:

    当 EC2 实例查询 Elastic 的外部 DNS 名称时 IP,EC2 DNS服务器返回实例的内部IP地址 当前分配的弹性 IP 地址。

    这里有一些示例说明了 dig 如何返回不同的值,比较了使用 Amazon 以外的机器 ping ec2 实例的场景与使用 ec2 实例 ping 另一个 ec2 实例的场景:-

    这是该弹性 IP 地址的永久外部 DNS 名称 否 无论您更改分配给它的实例多少次。 如果您从 EC2 外部查询此 DNS 名称,它将解析为 外部IP地址如上图:

    $ dig +short ec2-75-101-137-243.compute-1.amazonaws.com
    75.101.137.243
    

    但是,如果您从 EC2 实例内部查询此 DNS 名称,它 将解析为其所在实例的内部 IP 地址 当前已分配:

    $ dig +short ec2-75-101-137-243.compute-1.amazonaws.com
    10.254.171.132
    

    【讨论】:

    • 实际上问题是我在本地主机上运行我的服务器,没有 0.0.0.0。一旦我进行切换,并使用服务器正在运行的弹性 IP 调用客户端,一切正常!
    • 啊,我明白了。谢谢你也告诉我!
    猜你喜欢
    • 1970-01-01
    • 2011-08-14
    • 2021-10-05
    • 1970-01-01
    • 2016-08-11
    • 2014-01-11
    • 2013-08-27
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多