如何解决如何避免许多连接的DEALER崩溃使ZeroMQ ROUTER崩溃?
我在一个应用程序中有一个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方言),而不是缓冲一条消息,而是一条最新的传入消息。
版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 dio@foxmail.com 举报,一经查实,本站将立刻删除。