【发布时间】:2015-11-07 01:09:26
【问题描述】:
我在一个进程中有一个 ZMQ_PUB 套接字,连接到另一个进程中的 ZMQ_SUB 套接字,因为它是另一台服务器。我唯一需要做的就是尽可能多地发布消息。我确定它是先连接的。
我正在运行负载测试,从 PUB 发出数千条相同的消息。另一方面,我正在轮询 ZMQ_SUB 套接字,并仅在需要时接收消息。
奇怪的是,每收到 1000 条消息,zmq_poll 大约返回 3 次 ETERM。我想不通。
-- 下面的 cmets 中的解决方案。
【问题讨论】:
-
听起来您遇到了高水位线 (HWM) 的问题。默认情况下,所有套接字都设置为 1000。要获得更多信息,我们需要查看您的一些代码。顺便说一句,我不确定您的设置是否符合您的要求 - 当 SUB 套接字访问其 HWM 时,它会丢弃 new 传入消息。所以,当你暂时忽略 PUB 套接字时会发生什么,当你回去接收更多消息时,你会在你的套接字队列中收到 oldest 消息,而不是 newest 消息,在您点击 HWM 后已全部丢弃。
-
非常感谢,我马上去看看。
-
事实证明,这不仅发生在 PUB/SUB 中。我的 req/rep 也会发生这种情况,只有几条消息。 zmq_poll 突然返回 -1,就好像我正在关闭上下文一样。还没有线索。
-
您是否会像 StackOverflow Netiquette 鼓励的那样重新/考虑您的帖子以包含 MCVE 代码? 有许多聪明且知识渊博的专业人士很乐意让代码运行起来,但是没有任何 MCVE,没有太多需要审查和解决的问题。
-
谢谢大家。原来我误解了 poll、recv 和 send 函数的返回码。每次收到信号时它都会返回 -1,并且确实会收到很多 EINTR,这很好,完全正常。我可以忽略它们并重复我试图做的事情。在我的投票中,我可以继续。如果它来自发送或接收,我可以继续尝试发送或接收,只要 errno == EINTR。问题解决了。
标签: publish zeromq polling subscribe