NetMQ 与 clrzmq

NetMQ vs clrzmq

几个月前,我正在选择 .NET 库来实现 ZeroMQ 通信,我对 zeromq.org 上建议的库很少这一事实感到非常困惑。

同时我学到了一些东西,所以我会在这里分享。有人可能会觉得这很有帮助。所以让我问问自己:

NetMQ 和 clrzmq 有什么区别?

(虽然我会自己回答这个问题,但如果其他人对此主题有一些经验 - 欢迎提供替代答案!)

两者的主要区别在于方法:

  • CLRZMQ 是 binding 项目,它实际上在后台使用 libzmq 库(它是 libzmq 库的 .NET 包装器);
  • NetMQ 是 ZeroMQ 的 .NET 本地端口,这意味着它不会包装现有的 libzmq,而是 用纯 C# 重写它

使用哪一个?好吧,没有简单的答案。选择时需要注意以下几点:

  • 在可移植性方面 - NetMQ 遥遥领先,尤其是因为 NetMQ 有 .NET Core 版本。使用 NetMQ 部署也更容易 - 无需担心本地库(x64 / x86 等)。
  • 另一方面,NetMQ 实际上重写了所有内容这一事实对我来说有点可怕 - 始终存在某些内容未从原始代码精确镜像的风险,并且可能导致与其他 ZeroMQ 节点不兼容。还有一个问题是 NetMQ 将以多快的速度实现原始库中的新功能。
  • 表演。目前我不知道哪个库在性能上获胜,但这绝对是选择时要考虑的事情。 libzmq 应该比任何托管代码都快得多,但是在 CLRZMQ 和 libzmq 之间的通信中必须进行封送处理,所以我真的无法预测哪个库会在速度上获胜。

更新:NetMQ 的另一个重要优势是支持 - 您将在一两天内,有时甚至几小时内得到答案。

更新 2:NetMQ 中轮询器实现的问题(描述 here) turned out to be show-stopper problem for NetMQ in my case. Due to this problem I've migrated my projects to CLRZMQ (I may change my mind down the road...) Nevertheless, talking about poller, there's one problem in CLRZMQ documentation you should be aware of, and it's described here

根据 Doron Somech 的说法:

http://somdoron.com/2013/03/introducing-netmq/

自 2014 年起,不再维护 C# 绑定 (CLRZMQ),NetMQ 是 ZeroMQ 和 .Net 的默认选择。

好像是:

https://github.com/zeromq/clrzmq4

替换了原来的 CLRZMQ 项目。

我正在使用 NetMQ 并期待为该项目做出贡献。

P.S。我为 NetMQ 和本机 ZeroMQ 构建了相同的 Pub-Sub 场景,但没有发现任何性能差异。干得好,多伦!