【发布时间】:2011-04-11 04:59:23
【问题描述】:
我本周开始使用 ZeroMQ,当使用请求-响应模式时,我不确定如何让工作人员安全地“挂断”并关闭他的套接字,而不会丢失消息并导致发送该消息的客户永远得不到回应。想象一个用 Python 编写的工人看起来像这样:
import zmq
c = zmq.Context()
s = c.socket(zmq.REP)
s.connect('tcp://127.0.0.1:9999')
while i in range(8):
s.recv()
s.send('reply')
s.close()
我一直在做实验,发现127.0.0.1:9999 的套接字类型为zmq.REQ 的客户提出公平排队请求可能会不幸让公平排队算法在worker 已经完成了最后一个send(),但在它运行以下close() 方法之前。在这种情况下,似乎请求被工作进程中的ØMQ堆栈接收和缓冲,然后当close()抛出与套接字关联的所有内容时,请求就会丢失。
工人如何“安全地”分离——有没有办法发出“我不再需要消息”的信号,然后 (a) 循环在信号传输期间到达的任何最终消息,(b) 生成他们的回复,然后 (c) 执行 close() 并保证没有消息被丢弃?
编辑:我想我想进入的原始状态是“半关闭”状态,在这种状态下无法接收到更多请求——并且发送者会知道——但是在哪里返回路径仍处于打开状态,因此我可以检查传入缓冲区中是否有最后到达的消息,如果缓冲区中有一条消息,则对其进行响应。
编辑:为了回答一个好问题,更正了描述,使等待消息的数量成为复数,因为可能有许多连接在等待回复。
【问题讨论】:
-
我找到了这个线程,它是相关但不是真的:mail-archive.com/zeromq-dev@lists.zeromq.org/msg02338.html。您在这方面取得了进展吗?
-
不,我还没有取得进一步的进展,ZeroMQ 的专业知识似乎比我预期的要薄一些。感谢您的链接 - 当消息出站时,它似乎涉及另一个方向的消息安全,但会带来许多相同的问题。谢谢!
标签: python concurrency message-queue rpc zeromq