Linux 上的 ZeroMQ 和 TCP 重传

ZeroMQ and TCP Retransmits on Linux

我无法理解在 TCP 必须尝试重新传输消息的情况下哪些套接字类型会受到负面影响。

我们有一个分布式系统,它结合使用内部进程和外部设备和应用程序的进程内和 TCP 连接。我担心的是,如果有大量流量导致延迟和丢包,则 TCP 重传将导致系统延迟。

我想避免的是一个应用程序在队列中编译消息等待发送(通过单个 ZeroMQ TCP 套接字),因为 TCP 强制套接字重复重新传输从未发送确认的消息。

这是使用 ZeroMQ 时可能发生的问题吗?目前我在 Linux OS.

上使用 PUSH/PULL

或者这不是一个问题,如果不是,为什么?

来自外部的消息 devices/applications 不提供陈旧数据是至关重要的。

首先,唯一可以重传的传输方式是实际物理网络上的 TCP。然后可能不会在 LAN 上,因为以太网数据包不太可能在 LAN 上丢失。

计算机内部的 TCP,尤其是 IPC、INPROC 等都将保证每次都在第一时间传送数据。没有重传机制。

如果套接字使用的其中一种传输确实由于传输错误而出现延迟,那会减慢速度。 ZMQ 不能考虑消息 "sent" 直到它通过套接字使用的所有传输传播。 "sent" 的外部可见性是出站消息队列已从高水位线移开 1。

有可能任何一条消息通过 IPC 比 TCP 更快到达,并且消息 2 可能在消息 1 通过 TCP 到达之前通过 IPC 到达。但是,如果您依赖消息时间/相对顺序,那么您不应该首先使用 ZMQ;是Actor模型,不是CSP。

为弗兰克编辑

Actor和CSP的区别在于前者是异步的,后者是同步的。因此,对于 Actor 模型,发送方对于接收方实际收到消息的时间的信息为零。对于 CSP,发送/接收是一个执行会合——只有当接收完成时发送才完成。

这非常有用。如果在您的系统中,A 指示 C 在指示 B 之前(及时,而不仅仅是在 A 的代码流中)做某事没有意义,那么您可以使用 CSP(但不是 Actor 模型)来做到这一点。这是因为当 A 发送给 B 时,B 在 A 发送完成之前收到消息,从而释放 A 然后发送给 C。

不出所料,实时系统受益于 CSP。

因此考虑 ZMQ 的 Actor 模型,在 ZMQ 中混合了 TCP、IPC 和 INPROC 传输。通过 TCP 发送的消息很有可能比通过 INPROC 发送的消息晚到达很多,即使它们先发送也是如此。