有关使用ZeroMQ的建议

时间:2012-06-22 11:12:26

标签: zeromq

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

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

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

2 个答案:

答案 0 :(得分: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等
  5. 然而,将ZMQ误认为是消息传递队列是很常见的。

    1. Messaging Queue as available具有其他属性,如消息持久性和传递保证等,通过实现存储队列。
    2. ZMQ代表“Zero Messaging Queue”
    3. 我最近才学习ZMQ,并且非常乐意使用它。

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

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

答案 1 :(得分:1)

关于城堡整合,看看亨利在他的叉子上做了什么:

https://github.com/hconceicao/clrzmq2/tree/master/src/integration