在Linux上ZeroMQ和TCP重新传输

时间:2018-09-08 05:24:40

标签: sockets tcp network-programming zeromq distributed-system

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

我们有一个分布式系统,该系统将进程内和TCP连接组合在一起用于内部进程以及外部设备和应用程序。我担心的是,如果有大量流量导致延迟和数据包丢失,则TCP重传将导致系统延迟。

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

使用ZeroMQ是否会发生此问题?目前,我正在Linux操作系统上使用PUSH / PULL。

这不是问题吗?如果不是,为什么?

至关重要的是,来自外部设备/应用程序的消息不能提供过时的数据。

1 个答案:

答案 0 :(得分:2)

首先,唯一可能进行重传的传输是通过实际物理网络的TCP。然后可能不在局域网中,因为不太可能在局域网中丢失以太网数据包。

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

如果套接字使用的一种传输确实由于传输错误而导致延迟,则这将减慢速度。在通过套接字使用的所有传输方式传播消息之前,ZMQ都不会考虑“发送”消息。 “已发送”的外部可见性是,出站邮件队列已从高水位线移开1。

任何一条消息都可能比TCP更快地通过IPC到达,并且消息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模型,该模型结合了TCP,IPC和INPROC传输。通过TCP发送的消息很有可能比通过INPROC发送的消息晚很多,即使它们是先发送的。