ZMQ REP,知道谁发送请求

时间:2012-08-02 21:36:42

标签: zeromq pyzmq

我目前正在使用zmq和python。服务器正在使用REP套接字。

在收到消息时,我有办法知道是谁发送的吗?如果收到2条消息,我只需要知道它们是否来自同一个用户,所以例如uid就足够了。

2 个答案:

答案 0 :(得分:15)

看起来您希望在服务器端实现异步请求处理:您让服务器接受请求,异步处理它们,并在响应数据可用于每个请求时将响应发送回客户端。现在当然:在你完成处理请求之后,你怎么知道将哪个客户端发送回去?

使用简单的REP套接字,ZMQ通过强制执行recv() -> send(), recv() -> send()顺序确保您不会遇到此类问题。换句话说,在REP套接字上执行recv()后,必须再次send() recv()之前再次recv() -> send()。响应将被发送回您收到消息的客户端,并且毫无疑问客户的地址,因为它一次只有一个客户端。

但是当你想要并行化请求处理时,这并没有什么帮助,是吗?在很多情况下,REP的行为限制太多,而这正是Multipart消息和ROUTER(或XREP)套接字的用途。 XREP打破了REP的recv()锁步,但这导致了我们之前看到的问题 - 如果连接了多个客户端,您如何知道将回复发送回哪个客户端?为了使这项工作,ZMQ中的XREP在消息的前面添加了一个消息部分,如信封,其中包含{{1}}发出请求的连接的标识。

“ZMQ指南”中有关于advanced Request-Reply patterns的整章。您还可以找到处理异步请求here的示例以及ZMQ连接处理here的简短说明。

答案 1 :(得分:2)

阅读http://zguide.zeromq.org/page%3aall#Transient-vs-Durable-Sockets,您只能获得您正在使用的套接字的标识...而不是您所连接的任何同伴的套接字。

这就是说,只需将发件人信息构建到邮件中即可。这应该是微不足道的(使用UUID或每个客户端的特定名称)。