我在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中调整我的设置?
或者我的代码中有什么问题吗?非常感谢。
答案 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运营商不允许您在实例之间启动TCP / IP服务,则除了合同重新协商(选择其他受限制较少的产品)之外,没有其他步骤可能有所帮助。
如果未阻止TCP / IP服务,请咨询AWS运营商支持热线,各个实例上允许使用哪些端口号。除了上面提到的运营商策略之外,操作系统可能还有一些受限制的端口号范围,如果您的应用使用O / S阻止的 <transport-class>://<address>:<port#>
(== 1111
为上面的用例MCVE),任何尝试都会因为尝试使用禁用资源而系统地失败(更改<port#>
是最简单的补救措施,不是吗?)。
对于任何其他情况, ZMQError
将帮助您诊断阻止操作的根本原因。您可以根据需要随意添加尽可能多的调试跟踪点。