我如何在AWS负载均衡器上使用ZeroMQ?

时间:2018-03-28 09:15:52

标签: python amazon-web-services zeromq amazon-elb internal-load-balancer

我在VPC的私有子网中有两个EC2实例(vm1,vm2)和一个内部网络负载均衡器。在vm1中,我运行一个程序来连接AWS负载均衡器:

import zmq

if __name__ == '__main__':
    context = zmq.Context()
    socket = context.socket(zmq.REQ)
    socket.connect("tcp://aws-loadbalancer-dns-name:1111")

    for i in range(5):
        socket.send_string(str(i))
        msg = socket.recv()
        print('receive respond:', msg)

在vm2中,我还运行了一个程序:

import zmq
import time

if __name__ == "__main__":
    context = zmq.Context()
    socket = context.socket(zmq.REP)
    socket.bind("tcp://*:1111")

    while True:
        msg = socket.recv()
        print('receive request:', msg)
        socket.send_string(str(msg))
        time.sleep(1)

似乎失败了。

如何在AWS中调整我的设置?

或者我的代码中有什么问题吗?非常感谢。

1 个答案:

答案 0 :(得分:1)

第一部分:“我的代码中有什么问题吗?”:

不,ZeroMQ用例代码似乎没有问题。

随意根据需要在MCVE源中添加尽可能多的调试跟踪点,以便详细记录,获取的位置以及报告的实际 ZMQError() 苍蝇:

[ 'EADDRINUSE',          #           L3
  'EADDRNOTAVAIL',       #           L3
  'ECONNREFUSED',        #           L3
  'ENETDOWN',            # L1 / L2 / L3
  'ENODEV',              # L1
  'EFAULT',
  'EFSM',                # ZMQ Finite State Machine not in a state to obey this
  'EAGAIN',              # ZMQ Context() blocked
  'EINPROGRESS',
  'EINVAL',              # ZMQ did not recognise a valid value in param
  'EMTHREAD',
  'ENOBUFS',             # resources
  'ENOMEM',              # resources
  'ENOCOMPATPROTO',      # ZMQ protocol-handshaking
  'EPROTONOSUPPORT',     # ZMQ protocol 
  'ENOTSOCK',            # ZMQ resource - not recognised as an "own" socket
  'ENOTSUP',             # ZMQ cannot support a request
  'ETERM',               # ZMQ Context() already entered into a .term()-state
   ...
   ]

第二部分:“如何在AWS中调整我的设置?”:

这部分有点棘手。

首先,查阅您的合同参数。如果AWS运营商不允许您在实例之间启动TCP / IP服务,则除了合同重新协商(选择其他受限制较少的产品)之外,没有其他步骤可能有所帮助。

如果未阻止TCP / IP服务,请咨询AWS运营商支持热线,各个实例上允许使用哪些端口号。除了上面提到的运营商策略之外,操作系统可能还有一些受限制的端口号范围,如果您的应用使用O / S阻止的 <transport-class>://<address>:<port#> == 1111为上面的用例MCVE),任何尝试都会因为尝试使用禁用资源而系统地失败(更改<port#>是最简单的补救措施,不是吗?)。

对于任何其他情况, ZMQError 将帮助您诊断阻止操作的根本原因。您可以根据需要随意添加尽可能多的调试跟踪点。