为什么ZMQ路由器有时会丢失消息?

时间:2014-11-18 20:15:31

标签: python zeromq pyzmq

我有一台托管路由器套接字的机器:

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

并发送消息,并在一段时间后关闭。经销商端的连接没有正常关闭,机器只需关闭电源(不确定是否重要)。问题是我注意到有时新的经销商和#39;消息不会到达路由器。如何防止/调试这个以找出出错的地方?来自前任经销商的陈旧连接是否会阻止新消息到达?

1 个答案:

答案 0 :(得分:1)

首先注意:ZeroMQ不保证......

ZeroMQ明确建议设计消息传递体系结构,以防止不确定性和无保证传递。也就是说,您可能对此Pieter Hintjens出版的书中的解释感兴趣: enter image description here


第二个注意事项:ZeroMQ推荐Graceful Release&退出前终止

虽然上下文终止是本地主机问题,但与ZeroMQ套接字关联的资源的正常释放不是孤立的。 ZeroMQ-socket有两个端点,请求优雅释放是公平的,以避免远程端模糊和累积的副作用,因为可能会增加你的断电机器群。

简单地说,ZeroMQ内部有限状态机(本地(您负责简单地断电)和遥控器(您忽略))不会因任何此类行为而不稳定,可以(并且应该)进行公平优雅的资源和出口释放。

是的,这很重要。

如果您寻求稳定的分布式系统操作,您的代码将负责&应该总是在强制执行非阻塞(是的,强制执行,是的,非阻塞)清除退出上花费一些CPU时钟,即对前期负责任的照顾释放ZMQ套接字缓冲区,避免 ZMQ_LINGER 死端阻塞localhost失控等。

# _________________________________________________________________ # <CLEAN-EXIT>
#
# ZMQ_TIDY_UP
#
# _________________________________________________________________
dealer.setsockopt( zmq.LINGER, 0 )
dealer.close()
zmq_ctx.term()                         # aZMQ_CentralCONTEXT.term()
# _________________________________________________________________ # <CLEAN-EXIT>