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

标签 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

并发送消息,并在一段时间后关闭。经销商端的连接没有正常关闭,机器只是断电(不确定这是否重要)。问题是我注意到有时新经销商的消息不会到达路由器。我怎样才能防止/调试这个问题以找出问题所在?来自先前经销商的过时连接是否会阻止新消息到达?

最佳答案

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

ZeroMQ 明确建议设计消息传递架构以应对不确定性和无保证的交付。也就是说,您可能对 Pieter Hintjens 书中发表的解释感兴趣: enter image description here

<小时/>

第二个注意事项: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/

相关文章:

javascript - 将 Flask Session 与新的 EventSource 结合使用

python - 在 zmq 订阅者中自动重新连接

c++ - 如何设置 ZMQ PUB/SUB 模式以仅服务于预授权订阅者

c# - 0MQ windows GUI 最佳实践

zeromq 和 bind_to_random_port - 如何选择端口

c++ - 当 REQ-Socket 没有连接的对等点时 ZMQ 消息丢失

python - 试图了解 zeromq 高水位线行为

python - 根据出现对数组元素进行分组,保持顺序,获取第一个和最后一个索引

python - 如何在 Python 3 中从反斜杠符号中拆分反斜杠

Python 模块请求在 anaconda 提示符下工作,但在 Windows 10 命令行中不工作