有关使用ZeroMQ的建议

And*_*ens 13 zeromq

我正在开发一个新的客户端 - 服务器应用程序(.Net),到目前为止一直在使用WCF,它非常适合应用程序的请求 - 响应方法.但是我被要求用基于套接字的解决方案替换它,部分是为了支持非.Net客户端,以及未来的pub-sub/broadcast要求(我意识到WCF是有能力的,但是决定背后还有其他驱动因素).在编写我自己的异步套接字解决方案时惨遭失败,我现在正在关注ZeroMQ.

我的客户端应用程序有几个后台线程,定期从服务器请求数据.另外,某些UI动作(例如按钮点击)可以触发到服务器的消息.WCF使这很容易 - 代码简单地称为单独的WCF服务代理上的相关方法(实际上我使用Castle Windsor WCF工具,它给我异步调用功能,但这可能与我的问题无关).

我不太确定这种方法如何转化为ZeroMQ,特别是在管理套接字方面 - 我对ZeroMQ很新,还在阅读指南.我说得对,每个线程都需要一个单独的套接字(即两个b/g线程和UI)?套接字生存期怎么样 - 每次我想发送/接收时(创建效率低下)都创建一个,或者在线程启动时创建套接字并在线程的整个生命周期内重用它?

pyf*_*unc 15

有一点必须非常明确.ZMQ套接字只能连接和与ZMQ套接字通信.

这意味着如果我构建一个分布式应用程序,其组件相互通信,我可以自由选择任何通信方法,因为外部客户端不会暴露给它.

为这种方法选择ZMQ套接字是个好主意.它允许您立即构建许多通信模式,如req/rep,推/拉,发布/订阅等,并使用ZMQ设备构建更复杂的拓扑.

但是,当涉及外部客户时,不能轻视这种约束.这将强制所有外部客户端使用可能不理想的ZMQ套接字.如果其中一个客户端恰好是使用您的Web服务的浏览器,那么您将需要通过常规客户端提供服务.

您的客户端应用是否使用常规套接字?是否可以重写以使用ZMQ套接字?

如果没有,则不要将ZMQ套接字用于外部接口,而仅用于内部组件通信.

[编辑:附加说明]

ZMQ是套接字的包装器,但它做了一些难以手工完成的事情

  1. 它通过同时批量处理多个消息来管理更高吞吐量的消息传递
  2. 同时优化套接字的使用
  3. 套接字只能向另一个套接字发送消息,ZMQ套接字可以连接到多个ZMQ套接字
  4. 基于ZMQ套接字的解决方案可以立即利用各种模式 - REQ/REP,PUSH/PULL,PUB/SUB等

然而,将ZMQ误认为是消息传递队列是很常见的.

  1. 消息队列可用具有其他属性,如消息持久性和传递保证等,通过实现存储队列.
  2. ZMQ代表"零消息队列"

我最近才学习ZMQ,并且非常乐意使用它.

查看我在ZMQ上的迷你教程,看看你是否有意义使用它:

http://learning-0mq-with-pyzmq.readthedocs.org/en/latest/

  • 对于任何找到这个答案的人:"ZMQ套接字只能连接到ZMQ套接字"不再适用.见[here](http://stackoverflow.com/q/17176871/548513)或[here](http://comments.gmane.org/gmane.network.zeromq.devel/19547).ZMQ 4.x也可以连接TCP套接字. (3认同)
  • 对我来说,ZMQ感觉就像套接字周围的美化包装.我发现我必须编写大量代码才能使某些东西发挥作用.如果我的客户端过快地向服务器发送消息,它们将被丢弃.我必须编写代码(类似于ZMQ异步客户端 - 服务器示例),以在服务器中使用多个工作线程,以确保快速处理传入的消息.当然,MQ的重点是采用排队机制来阻止消息丢失?!它似乎缺乏你在其他MQ中开箱即用的东西,我发现它有点令人沮丧. (2认同)