【问题标题】:How to avoid many connected DEALER-s to crash a ZeroMQ ROUTER?如何避免许多连接的 DEALER-s 使 ZeroMQ ROUTER 崩溃?
【发布时间】:2020-11-10 23:09:09
【问题描述】:

我在一个应用程序中有一个ROUTER-socket,多个DEALER-sockets 在不同的应用程序中连接到。我希望ROUTER 尽可能强大。

这是我想在ROUTER 上处理好的特定场景:

  1. 1000-s of DEALER-s 连接到 ROUTER
  2. 每个DEALERROUTER 发送一个请求,而不是使ROUTERDEALER 发送一个大响应
  3. DEALER-s 不读取响应,而是立即重复第二步

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

我使用的一些选项有帮助:

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

ZMQ_SNDTIMEO : ZeroMQ 将在 N 毫秒后丢弃消息,没有成功发送

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

我可以使用其他选项来防止客户端请求使我崩溃吗?

【问题讨论】:

    标签: zeromq distributed-computing low-latency


    【解决方案1】:

    “我可以使用任何其他选项来防止客户请求使我崩溃吗?”

    虽然设置超出了我的想象,但为什么要移动数以万计的字节而不是 .recv() 他们,让我向您推荐一个将内存分配限制到最低工作量的技巧:

    我们可以使用.setsockopt( zmq.CONFLATE )-trick(使用 Python 方言),而不是缓冲任何其他内容,而是缓冲一条最新的传入消息。

    【讨论】:

      猜你喜欢
      • 2017-06-28
      • 2020-05-17
      • 1970-01-01
      • 1970-01-01
      • 2018-02-02
      • 1970-01-01
      • 1970-01-01
      • 2016-06-02
      • 1970-01-01
      相关资源
      最近更新 更多