我有一台托管路由器套接字的机器:
router = zmq_ctx.socket(zmq.ROUTER)
router.setsockopt(zmq.constants.ROUTER_HANDOVER, 1)
router.bind(url)
然后我有很多机器像这样与它建立连接。
dealer = zmq_ctx.socket(zmq.DEALER)
dealer.setsockopt(zmq.IDENTITY, options.identity)
dealer.connect(url)
# send some message every 10 seconds
并发送消息,并在一段时间后关闭。经销商端的连接没有正常关闭,机器只是断电(不确定这是否重要)。问题是我注意到有时新经销商的消息不会到达路由器。我怎样才能防止/调试这个问题以找出问题所在?来自先前经销商的过时连接是否会阻止新消息到达?
最佳答案
首先注意:ZeroMQ 不保证...
ZeroMQ 明确建议设计消息传递架构以应对不确定性和无保证的交付。也就是说,您可能对 Pieter Hintjens 书中发表的解释感兴趣:
<小时/>第二个注意事项:ZeroMQ 建议在退出之前进行优雅释放和终止
虽然上下文终止是一个本地主机问题,但与 ZeroMQ 套接字相关的资源的正常释放并不是一个孤立的问题。 ZeroMQ 套接字有两端,请求优雅的释放是公平的,以避免远程端模糊性和累积的副作用,这些副作用可能会在您的断电机器群中增长。
简单地说,ZeroMQ 内部有限状态机(本地(您负责简单地关闭电源)和远程(您忽略的))不应因任何此类行为而不稳定,因此公平、优雅地释放资源和退出可能(并且应该)发生。
是的,这很重要。
如果您寻求稳定的分布式系统操作,您的代码要负责,并且应始终花费一些 CPU 时钟强制执行非阻塞(是的,ENFORCING &是的,非阻塞)干净退出,即负责抢占的 ZMQ 套接字缓冲区,避免 ZMQ_LINGER
死胡同本地主机失控等。
# _________________________________________________________________ # <CLEAN-EXIT>
#
# ZMQ_TIDY_UP
#
# _________________________________________________________________
dealer.setsockopt( zmq.LINGER, 0 )
dealer.close()
zmq_ctx.term() # aZMQ_CentralCONTEXT.term()
# _________________________________________________________________ # <CLEAN-EXIT>
关于python - 为什么ZMQ路由器有时会丢失消息?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/27003212/