为啥 zmq 将多条消息打包到一个 TCP 帧中?

Posted

技术标签:

【中文标题】为啥 zmq 将多条消息打包到一个 TCP 帧中?【英文标题】:Why does zmq pack several messages to one TCP frame?为什么 zmq 将多条消息打包到一个 TCP 帧中? 【发布时间】:2020-05-16 15:41:06 【问题描述】:

我使用带有ZMQ_DONTWAIT 标志的ZMQ_PUSH 套接字发送消息。每条消息间隔 300 毫秒(所以我严重怀疑我的线程调度是否如此关闭)。然而,有时会有几条(到目前为止最多 7 条)消息被打包到同一个 TCP 帧中,但我在 tcpdump 中看不到任何重新传输或重新连接。

为什么会这样?我如何确定我的消息何时发送?

【问题讨论】:

en.wikipedia.org/wiki/Nagle%27s_algorithm 通常假设 tcp 每帧一条消息也是错误的,因为它是基于连接的协议,而不是基于消息的 好吧,但我想我可以假设每 2.1 秒至少有 1 个 TCP 帧 我最好的猜测是 ZMQ 中的一个错误,这不会是第一次。 TCP 是一种流协议,在应用层没有帧/数据包/消息。任意数量的send() 调用可以对应于任意数量的recv() 调用,并且您不能假设您的数据以您发送的顺序可靠传输。 TCP 通常不保证任何有限的传输时间,因此如果底层连接碰巧很慢和/或不可靠,则可能需要相当长的时间才能到达您的数据 【参考方案1】:

“我如何确定我的消息何时发送?”

欢迎来到 Zen-of-Zero 的 ZeroMQ 艺术。

您有零机会知道被分派发送的消息何时最终到达线路级别。

这是概念的属性,而不是错误。它在文档中明确解释,因为 API v2.0+(并且很可能永远保持如此)。公平地补充一点,对zmq_context-instance 内部性的一些见解可能来自最近的 API 版本中可用的socket_monitor


如果您从未与ZeroMQ 合作过,可以在这里先看看"ZeroMQ - Principles in less than Five Seconds"在深入了解更多细节之前


【讨论】:

以上是关于为啥 zmq 将多条消息打包到一个 TCP 帧中?的主要内容,如果未能解决你的问题,请参考以下文章

消息队列库——ZeroMQ

Centos zeromq 消息队列 安装

FastAPI如何将ZMQ添加到事件循环

zmq 交换和 HWM

zmq消息传输基本功能的实现传输模式

ZeroMQ使用学习记录(转)