将pub / sub与zeromq中的req / rep结合使用

时间:2011-07-16 14:04:03

标签: zeromq

客户端如何使用zeromq订阅和收听回复? 也就是说,在客户端,我想运行一个只接收消息并有选择地发送请求的循环,而在服务器端我想发布大部分时间,但有时也会收到请求。 看起来我必须有两个不同的插座 - 每个插槽用于一种通信模式。是否有可能避免这种情况,并在服务器端从zeromq回调线程上的套接字接收“请求通知”,同时将消息推送到我自己的线程中的套接字?

3 个答案:

答案 0 :(得分:15)

我对ZeroMQ非常陌生,所以我不确定你想要的是否是最佳实践。但是,使用zmq_poll时,使用多个套接字的解决方案非常简单。

基本思想是同时拥有客户端和服务器:

  • 打开pub / sub
  • 的套接字
  • 为req / rep打开一个套接字
  • Multiplex在无限循环中使用zmq_poll在循环中的两个套接字之间发送和接收
  • 在循环中处理req / rep和pub / sub事件

以这种方式使用zmq_poll多个套接字很不错,因为它完全避免了线程。 0MQ指南有一个good example here。请注意,在该示例中,它们在-1中使用zmq_poll的超时,这导致它阻塞,直到在任何多路复用套接字上发生至少一个事件,但是使用超时时间很常见如果您的循环也需要执行其他工作,则为x毫秒或其他内容。

答案 1 :(得分:2)

您可以使用2个线程来处理不同的套接字。挑战在于,如果需要在线程之间共享数据,则需要以安全的方式进行同步。

另一种方法是使用ZeroMQ Poller选择具有新数据的套接字。然后,该过程将以bjlaub解释的方式使用单个循环。

答案 2 :(得分:1)

这可以使用Majordomo Protocol的变体/子集来完成。这是个主意:

您的服务器将是路由器插座,您的客户将是经销商插座。连接到服务器后,客户端需要发送某种订阅或“hello”消息(您的设计)。服务器接收该数据包,但(作为router socket)也接收该客户端的ID。当服务器需要向该客户端发送内容时(通过您的设计),它会将其发送到该ID。客户可以随意发送和接收,因为它是经销商插座。