如何避免许多连接的DEALER崩溃使ZeroMQ ROUTER崩溃?

问题描述

我在一个应用程序中有一个ROUTER套接字,在不同应用程序中有多个DEALER套接字连接到了。我希望ROUTER尽可能健壮。

这是我想在ROUTER上处理的特定情况:

    {li> 1000中的DEALER-s连接到ROUTER
  1. 每个DEALERROUTER发送一个请求,这将使ROUTERDEALER发送较大的响应
  2. DEALER而不是读取响应,而是立即重复第二步

我在ROUTER上看到的一种行为:它会为响应创建大量非常大的ZeroMQ消息,然后将zmq发送回DEALER。当实际发送消息时,ZeroMQ负责取消分配消息。由于DEALER-永不调用recv(),因此ZeroMQ会永久保留该消息,并且内存会慢慢“泄漏”,直到O / S在内存不足时杀死该进程。

一些我曾使用过的选项:

ZMQ_SNDHWM:将我们限制为仅对每个DEALER保留传出队列中的N条消息,但这并不理想,因为ROUTER将在队列已满时丢弃传出消息>

ZMQ_SNDTIMEO:ZeroMQ将在N毫秒后丢弃消息,但不会成功发送

指定了这些选项后,如果ROUTER的连接数为1000,则DEALER仍然可能崩溃,因为高水位标记是针对每个客户端应用的。

我还有其他选择可以用来防止客户端请求崩溃吗?

解决方法

Q “我还有其他选择可用来防止客户端请求崩溃吗?”

虽然设置超出了我的想象,但是为什么不移动成千上万个字节到.recv()'em,让我为您提出一个把内存分配限制到最小工作量的窍门:

我们可能会使用.setsockopt( zmq.CONFLATE )技巧(使用Python方言),而不是缓冲一条消息,而是一条最新的传入消息。