我有一个ZeroMQ ROUTER
/ DEALER
一对正式通信原型,用于两台计算机之间的异步通信。
如果带有DEALER
套接字的计算机暂时脱机并返回,则会丢失一些消息。
我确实理解ZeroMQ无法无限期地保留消息,因为无法保证DEALER
- 方面永远不会回来。我正在寻找配置此行为的方法 - 是否有一个设置可用于控制消息在放弃之前保留多长时间?
哪些设置可能会影响此行为?
我不认为该问题与高水位线设置的值有关,因为传输的数据量非常低。
Windows上的ZeroMQ版本4.0.4。
我不确定要显示的代码的相关部分究竟是什么。此外,将事情脱离背景并使其易于理解并非完全直截了当。我会试试,所以这里。
这是路由器套接字的初始化方式:
router-socket (doto (zmq/socket zmq-context :router)
(zmq/set-receive-timeout 100)
(zmq/set-recv-hwm 0)
(zmq/set-send-hwm 0)
(zmq/bind (str "tcp://*:" (:port request-handler))))
发送消息使用zmq / send函数。
即使没有clojure经验,zeromq部分也应该清晰。
以下是经销商的初始化方式(C#):
var dealer = context.CreateSocket( SocketType.DEALER );
dealer.SendHighWatermark = 0;
dealer.ReceiveHighWatermark = 0;
接收消息使用ZmqSocket.ReceiveMessage方法(实际上它是SendReceiveExtensions类中的扩展方法,但无论如何)。
发生包装丢失的一个(可能是主要的)情况是运行经销商的计算机进入睡眠状态(=笔记本电脑盖关闭)并在几分钟后被唤醒。就像我在原始问题中所说的那样,我假设由于路由器暂时放弃经销商回来因此丢弃消息而丢失了包裹。但这只是一个假设,原因可能也是其他原因。