【问题标题】:How could I use ZeroMQ on an AWS load balancer?如何在 AWS 负载均衡器上使用 ZeroMQ?
【发布时间】:2018-03-28 09:15:52
【问题描述】:

我在 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 中的设置?

还是我的代码有问题?非常感谢。

【问题讨论】:

  • 为什么你认为 zeromq == echo server?

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


【解决方案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 将帮助您诊断操作被阻止的根本原因。随意添加尽可能多的调试跟踪点。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2014-12-18
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2021-12-04
    • 2018-04-14
    • 2017-07-31
    • 1970-01-01
    相关资源
    最近更新 更多