问题描述
我在一个应用程序中有一个ROUTER
套接字,在不同应用程序中有多个DEALER
套接字连接到了。我希望ROUTER
尽可能健壮。
这是我想在ROUTER
上处理的特定情况:
-
{li> 1000中的
- 每个
DEALER
向ROUTER
发送一个请求,这将使ROUTER
向DEALER
发送较大的响应 -
DEALER
而不是读取响应,而是立即重复第二步
DEALER
-s连接到ROUTER
我在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方言),而不是缓冲一条消息,而是一条最新的传入消息。