当 Python ZMQ PULL 套接字以不同于 PUSH 套接字的速度接收消息时会发生什么?

What happens when Python ZMQ PULL socket is receiving messages at a different speed than the PUSH socket?

假设 PUSH 套接字每 1 秒发送一次消息,PULL 套接字每 10 秒接收一次消息。

因此,在 100 秒内,PUSH 套接字发送了 100 条消息,而 PULL 套接字仅收到 10 条。

现在,如果 PUSH 套接字死了,而 PULL 套接字保持 运行 会怎样? 它还会收到消息吗?

另外,PUSH套接字hold无人接收的消息是否有限制?

你会在文档中找到所有内容,但我认为答案如下:

要了解 PUSH 套接字死机时会发生什么,了解一点 ZMQ 的工作原理会有所帮助。当您向 PUSH 套接字写入消息时,您实际上是在请求 ZMQ 管理线程缓冲和传输该消息。它与缓冲它的客户端中的 ZMQ 管理线程对话(使用 ZMTP 协议)。客户端的管理线程随后将通知客户端应用程序已收到一条消息。客户端 ZMQ 管理线程将消息保存在其缓冲区中,直到应用程序读取消息。

缓冲区的大小不是无限的。对于恒定的消息流,有时客户端管理线程的消息缓冲区可能会填满,这意味着它拒绝从发送方接收消息,这意味着发送方的管理线程的缓冲区开始填满。最终,它将拒绝接收来自发送应用程序的消息,并且 zmq_send() 块。

您可以通过在套接字上设置高水位线来改变这些缓冲区的大小,但默认情况下它们会按需增长(我认为)。这意味着消息可以累积直到内存耗尽,但无论所有缓冲区是否已满,PUSH 套接字写入块。

因此,只要管理线程协作以保持客户端缓冲区至少包含某些内容,消息就会以组合应用程序的峰值速率流动(在您的示例中每 10 秒 1 次)。问题是如果客户端应用程序没有以发送应用程序正在写入的速率读取,这些线程决定做什么?

我相信 ZMQ 版本 3 和 4 之间的策略发生了变化。我认为在 v3 中,他们偏向于在发送端累积消息。但在 v4 中我认为它们切换了,并且消息将在客户端缓冲区中累积。

这意味着,只要管理线程缓冲区没有填满,对于版本 4,如果 PUSH 端死了,那么所有已发送但尚未读取的消息都已通过网络传输并等待PULL 端的管理线程缓冲区,并且可以读取。而在版本 3 中,PUSH 端管理线程缓冲区中会保留更多消息,并且当 PUSH 端死亡时它们还没有被发送。

我可能把版本 3、4 搞错了。