我正在开发一个新的客户端 - 服务器应用程序(.Net),到目前为止一直在使用WCF,它非常适合应用程序的请求 - 响应方法。但是我被要求用基于套接字的解决方案替换它,部分是为了支持非.Net客户端,以及未来的pub-sub / broadcast要求(我意识到WCF是有能力的,但是决定背后还有其他驱动因素)。在编写我自己的异步套接字解决方案时惨遭失败,我现在正在关注ZeroMQ。
我的客户端应用程序有几个后台线程,定期从服务器请求数据。另外,某些UI动作(例如,按钮点击)可以触发到服务器的消息。 WCF使这很容易 - 代码简单地称为单独的WCF服务代理上的相关方法(实际上我使用Castle Windsor WCF工具,它提供异步调用功能,但这可能与我的问题无关)。
我不太确定这种方法如何转化为ZeroMQ,特别是在管理套接字方面 - 我对ZeroMQ很新,还在阅读指南。我说对于每个线程我都需要一个单独的套接字(即两个b / g线程和UI)吗?套接字生存期怎么样 - 每次我想发送/接收时(创建效率低下)都创建一个,或者在线程启动时创建套接字并在线程的整个生命周期内重用它?
答案 0 :(得分:15)
有一点必须非常明确。 ZMQ套接字只能连接并与ZMQ套接字通信。
这意味着如果我正在构建一个其组件相互通信的分布式应用程序,我可以自由选择任何通信方法,因为外部客户端不会接触它。
为这种方法选择ZMQ套接字是个好主意。它允许您立即构建许多通信模式,如req / rep,推/拉,发布/订阅等,并使用ZMQ设备构建更复杂的拓扑。
然而,当涉及外部客户时,不应轻视这种约束。这将强制所有外部客户端使用可能不理想的ZMQ套接字。如果其中一个客户端恰好是使用您的Web服务的浏览器,那么您将需要通过常规客户端提供服务。
您的客户端应用是否使用常规套接字? 是否可以重写它以使用ZMQ套接字?
如果没有,则不要将ZMQ套接字用于外部接口 但仅限于您的内部组件通信。
[编辑:补充说明]
ZMQ是套接字的包装,但它做了一些难以手工完成的事情
然而,将ZMQ误认为是消息传递队列是很常见的。
我最近才学习ZMQ,并且非常乐意使用它。
查看我在ZMQ上的迷你教程,看看你是否有意义使用它:
答案 1 :(得分:1)
关于城堡整合,看看亨利在他的叉子上做了什么:
https://github.com/hconceicao/clrzmq2/tree/master/src/integration