【问题标题】:ZeroMQ: REQ/REP with large messagesZeroMQ:带有大消息的 REQ/REP
【发布时间】:2015-12-14 18:48:43
【问题描述】:

我正在尝试通过 REP-socket 发送大型消息 (300 MB)。
有多个客户端,每个客户端都通过 REQ-socket 连接到服务器。服务器为每个客户端创建一个专用套接字,等待请求(包含标识符)并使用 ZMQ_SENDMORE 分两部分发送消息:

  1. 元数据 (~1 KB)
  2. 数据(~300 MB)

之后REP-socket 立即关闭。 Context()-instance 然后在父线程中关闭。 ZMQ_LINGER 套接字的时间保留为默认值(无限)。 有时会发送元数据,但不会发送图像数据。
我跟踪 ZeroMQ 中的调用,发现内部(Windows)套接字在消息数据发送到网络之前已关闭。我认为只要队列中有未发送的消息,zmq_term() 就会阻塞。
作为一种解决方法,我将客户端更改为在接收到数据作为确认后发送另一条请求消息。这工作得很好,但我不太确定我是否已经解决了根本问题。

ZeroMQ 版本是 4.0.4。我正在使用 C++ 绑定。服务器和客户端都在 Windows(7 和 10)上运行。

【问题讨论】:

  • 您对 REQ/REP 会话使用什么传输类?您可能想知道,StackOverflow 鼓励用户发布所谓的 MCVE -- a M -inimum C -omplete V - 可验证的E - 代码示例(+ 数据,必要时)重现审查中的问题。无论如何,享受这个伟大的知识社区。​​span>
  • 您有重现问题的小样本吗?如果是这样,我鼓励您也将其发布在 zeroMQ 邮件列表中。

标签: c++ sockets zeromq


【解决方案1】:

我知道这不是您想要的答案,但我在 Linux 上使用 ZeroMQ 时遇到过类似的情况。底层 Linux 套接字关闭,一些消息从未通过。

在我的用例中,我保持服务器打开,直到用户给我一些键盘输入。这是一个 hack,但对于我的用例,它给了我想要的东西。

您也可以在关闭套接字之前休眠一两秒钟。再一次,不是很漂亮,但它可能是一个快速修复,直到它得到修补。

编辑添加:我也在发送多部分消息,我的消息部分之一相当大(~200MB)。

【讨论】:

  • Pete,您可能已经知道,ZeroMQ 为您提供了更多类似情况的控制。可以在相关对等方之间创建多个/多个套接字并在进程之间显式发送信号(是的,发送软信号SIG_TERM、SIG_KILL 等),从而创建对远程.close() 的显式请求 通信渠道的传输基础设施如果并且一旦需要(让流程本身变得聪明而明确,而不是依赖 "bloody"-hacks 一旦可以保持整洁和有限状态自动机对系统所依赖的宝贵资源的显式控制)。
  • @It'sPete 你有重现这个问题的例子吗?如果您可以提供代码示例并将其发布到邮件列表或在 Github 上创建问题,它将大大提高快速修复的机会。
猜你喜欢
  • 2016-11-17
  • 1970-01-01
  • 2014-01-03
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2020-07-17
  • 2013-06-07
  • 2014-10-11
相关资源
最近更新 更多