如何配置ZeroMQ ROUTER套接字以继续尝试长时间发送包?

如何配置ZeroMQ ROUTER套接字以继续尝试长时间发送包?

问题描述:

我有一个ZeroMQ ROUTER/DEALER一对形式通信原型,用于两台计算机之间的异步通信。如何配置ZeroMQ ROUTER套接字以继续尝试长时间发送包?

如果与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 /发送功能。

即使没有Clojure的经验zeromq部分应该是清楚的。

这里的经销商如何初始化(C#):

var dealer = context.CreateSocket(SocketType.DEALER); 
dealer.SendHighWatermark = 0; 
dealer.ReceiveHighWatermark = 0;  

的信息的接收使用ZmqSocket.ReceiveMessage方法(当然,实际上这是在SendReceiveExtensions类的扩展方法,但无论如何)。

一个(可能是主),其中包损失发生时运行经销商计算机进入睡眠状态(=膝上型盖关闭),并且之后唤醒一些分钟的情况。就像我在我原来的问题中所说的那样,我认为由于路由器暂时放弃返回的经销商并因此丢弃消息而丢失了包裹。但这只是一个假设,原因也可能是别的。

因此,我们先来看看ZeroMQ Context()-引擎设置,这是ZeroMQ中使用.setsockopt()方法的功能运行智能信令/消息传递的所有低层次内容的最终权威。

对于真实世界的故障排除,没有什么比一刀切的,因此没有任何代码,有很多事情可以通过猜测和过去的麻烦,满足。

虽然一些根本原因的东西实际上可能被ZeroMQ过程的其他一些习惯所掩盖,在引擎盖下运行,但下面的文本更多地是关于平衡行为艺术的一个尽可能广泛的视角,而不是一步一步的导航。

刚超过几句话,将这些嫌疑人做起,从智能API选项长长的名单:


ZMQ_RECONNECT_IVL:设置连接区间

ZMQ_RECONNECT_IVL购股权为指定的套接字设置初始重新连接间隔。重新连接间隔是ØMQ在使用面向连接的传输时尝试重新连接断开的对等端之间等待的时间。

与在降低开销的等待时间帮助更新丢失的低级别的连接过程中幸存的虚假LOS和类似的服务辍学下文提到的战略展望从~ 100 [ms]短一些2 [ms]与调整ZMQ_RECONNECT_IVL_MAX几个其倍数,可以一起。

Ref。也可以通过ZMQ_TCP_KEEPALIVE_{CNT | IDLE | INTVL}ZMQ_TCP_MAXRT和O/S覆盖(可在支持O/S的地方使用)。


这其中将突出状态,当同龄人都没有连接,因此该消息传递策略可能会调整在用户的应用程序代码,观察病例:

ZMQ_IMMEDIATE:将消息仅排队到已完成的连接

默认情况下,即使连接尚未完成,队列仍将填充传出连接。这可能导致带有循环路由的套接字上的“丢失”消息(REQ,PUSH,DEALER)。如果此选项设置为1,则消息只应排队等待完成的连接。如果没有其他连接,这将导致套接字阻塞,但会阻止队列填充等待连接的管道。

随着类似的策略,正如上面贴的DEALER侧的,ROUTER侧可以使用ZMQ_PROBE_ROUTER设置,以便引导到ROUTER插座


如果主要可能的,并且连接如果在成本方面仍然合理,可以使用定期注入的“服务”声纳嘟嘟声:

ZMQ_HEARTBEAT_IVL:发送ZMTP之间设置间隔心跳

ZMQ_HEARTBEAT_IVL选项将设置发送ZMTP心跳对指定的插槽之间的间隔。如果设置此选项并且大于0,则每隔ZMQ_HEARTBEAT_IVL毫秒发送一次PING ZMTP命令。

ZMQ_HEARTBEAT_TIMEOUT:为ZMTP设置超时心跳

ZMQ_HEARTBEAT_TIMEOUT选项将设置多长时间超时;发送PING命令ZMTP并没有收到任何流量后,连接之前要等待。此选项仅在ZMQ_HEARTBEAT_IVL也设置且大于0时有效。如果在发送PING命令后没有收到流量,但连接将超时,但接收的流量不必是PONG命令 - 任何接收到的流量将取消超时。

ZMQ_HEARTBEAT_TTL:设置TTL值ZMTP心跳

ZMQ_HEARTBEAT_TTL选项应当建立远程对等的超时ZMTP心跳。如果这个选项大于0,如果在TTL周期内没有收到更多的流量,远程端会超时。如果ZMQ_HEARTBEAT_IVL未设置或为0,则此选项不起作用。在内部,该值向下舍入到最接近的十分位,任何小于100的值都不起作用。


ZMQ_CONNECT_TIMEOUT:设置connect()超时

设置了多久时间,出connect()系统调用来等待。系统调用通常需要很长时间才会返回超时错误。设置此选项可让库在较早的时间间隔超时。

设置几个[ms]可能有助于清除间歇性中断和/或在它们之间打开新的服务窗口。为了允许这种短窗策略工作,还应该减少ZMQ_HANDSHAKE_IVL所允许的最大值。


ZMQ_BACKLOG:未完成的连接

的队列的设置最大长度

ZMQ_BACKLOG选项应设定为指定的套接字优秀的对等连接的队列的最大长度;这仅适用于面向连接的传输。有关详细信息,请参阅您的操作系统文档,以获取listen函数。

这里有一百个服务器可以运行良好,但没有关于“丢失”连接数的详细信息,让我们将它保留在故障排除者的购物清单上。

+0

感谢您的全面回答! 我添加了代码示例和一些问题的进一步说明。 我还没有尝试过您所描述的设置。我会在下面对他们发表评论。 –

+0

ZMQ_RECONNECT_IVL - 如果我理解正确,这会影响zeromq在可以重新建立后多快恢复连接。目前这不是问题 - 重新连接很快就会发生。然而,一旦这样做,运行经销商的代码会发现一些消息丢失(它们被编号以便能够注意到这种情况)。 –

+0

ZMQ_TCP_MAXRT - 来自http://api.zeromq.org/4-2:zmq-setsockopt:“网络中断后,可能需要很长时间才能重新建立会话。设置此选项允许超时发生在一个较短的时间间隔。“ 我对文档进行了解释,这也影响了会话重新建立的时间。它似乎不被认为会影响消息的丢失。 –