13

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

我的客户端应用程序有几个后台线程,它们会定期从服务器请求数据。此外,某些 UI 操作(例如,单击按钮)可以触发向服务器发送消息。WCF 使这变得简单——代码只是在单例 WCF 服务代理上调用了相关方法(实际上我使用 Castle Windsor WCF 工具,它为我提供了异步调用功能,但这可能与我的问题无关)。

我不太确定这种方法将如何转化为 ZeroMQ,尤其是在管理套接字方面——我对 ZeroMQ 非常陌生,并且仍在阅读指南。我是否正确地说每个线程都需要一个单独的套接字(即两个 b/g 线程和 UI)?套接字生命周期怎么样 - 我是在每次想要发送/接收时创建一个(可能效率低下),还是在线程启动时创建套接字并在线程的整个生命周期内重用它?

4

2 回答 2

16

一件事必须非常清楚。ZMQ 套接字只能连接和对话 ZMQ 套接字。

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

为这种方式选择 ZMQ 套接字是一个好主意。它允许您立即构建许多通信模式,如 req/rep、push/pull、pub/sub 等,还可以使用 ZMQ 设备构建更复杂的拓扑。

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

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

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

[编辑:进一步说明]

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

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

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

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

最近才在学习ZMQ,用起来很开心。

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

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

于 2012-06-26T06:44:19.747 回答
1

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

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

于 2012-12-18T00:59:27.997 回答