ZeroMQ:如何向特定订户发送消息

时间:2015-06-18 14:22:31

标签: sockets zeromq publish-subscribe messages

在我的场景中,有n个客户端和1个服务器。客户端向服务器发送请求并接收响应。此外,还需要单向消息传递机制,其中服务器向特定客户端发送特定消息,并且不希望回答。因此,服务器必须能够使用单向消息传递机制专门针对客户端。

请求 - 响应部分很简单(REQ和REP套接字),但我不确定如何实现单向消息传递部分。我尝试使用PUB和SUB套接字,每个订阅者从服务器请求ID,并仅订阅具有此ID的消息,如下所示:

rc = zmq_setsockopt (subscriber, ZMQ_SUBSCRIBE,
                     subscriber_id, strlen (subscriber_id));

这在理论上有效,但问题是所有消息都被广播,然后在客户端进行过滤,这对我来说不是一个选择。

所以我的问题是:有没有更好的方法来解决特定的客户?

1 个答案:

答案 0 :(得分:2)

所以,只有两种方法可以做你想要的,而且他们都没有直接击中目标 - 但最后我提出了一个可能更好的建议。

您要求服务器套接字直接指向客户端套接字的要求只能通过以下两种方式完成:

  • 使用ROUTER套接字。 ROUTER套接字发送的消息的第一帧是目标对等体的套接字ID。它是唯一支持任何类型的通用寻址的套接字类型。
  • 每个对等方向旋转一个套接字。这样就可以处理应用程序中的寻址:知道哪个套接字属于你想要的对等端,你就可以使用它。

如果需要是单向套接字类型,那么第二种方法是您唯一的选择。然后,您可以选择任何单向通信策略(PUB / SUB,PUSH / PULL),并为每个连接设置一个新套接字。

强烈推荐ROUTER选项,几乎没有理由强制单向要求。只需在ROUTER上将接收HWM设置为1,并忽略或丢弃定期发送给它的消息。或者,跳过REP / REQ对,只需用ROUTER / DEALER做所有,这可能是最好的选择。