为什么ZeroMQ不应该成为你的第一选择

2014 年 8 月 12 日

Tyler Treat 是一名软件开发人员,他近日发表了一篇博文《为什么ZeroMQ 不应该成为你的第一选择》。

文中,Tyler Treat 对 nanomsg 和 ZeroMQ 进行了比较。nanomsg 是一个套接字库,提供了多种常见的通信协议,其目标是使网络层更快、更具扩展性、更容易使用。它用 C 进行了彻底地重写,可以说是对 ZeroMQ 的重建。它构建在 ZeroMQ 的可靠性能之上,同时又提供了若干重要的改进。而且,它还试图消除 ZeroMQ 经常出现一些怪异行为。作者从以下几个方面对二者进行了比较:

  • 用于新传输协议的 API——对于 ZeroMQ,人们经常抱怨的问题是它没有提供用于新传输协议的 API,这从根本上把用户限制在 TCP、PGM、IPC 和 ITC 上。而 nanomsg 提供了一个可插拔的接口,用于新的传输(如 WebSockets)和消息协议。
  • POSIX 兼容性——nanomsg 完全兼容 POSIX,而且 API 更简洁,兼容性更好。在 ZeroMQ 中,套接字用空指针表示,然后绑定到上下文;而在 nanomsg 中,只需要初始化一个新的套接字并使用它,一步即可完成。
  • 线程安全——ZeroMQ 在架构上有一个根本性缺陷:其套接字不是线程安全的。在 ZeroMQ 中,每个对象都被隔离在自己的线程中,因此不需要信号量和互斥锁。并发是通过消息传递实现的。nanomsg 消除了对象与线程间的一对一关系,它不再依赖于消息传递,而是将交互建模为一组状态机。因此,nanomsg 套接字是线程安全的。
  • 内存和 CPU 使用效率——ZeroMQ 使用一种很简单的 Trie 结构存储和匹配发布 / 订阅服务。当订阅数超过 10000 时,该结构很快就显现出不合理之处了。nanomsg 则使用一种称为“基数树(radix tree)”的结构来存储订阅,并提供了真正的零复制 API,允许内存从一台机器复制到另一台机器,而且完全不需要 CPU 的参与,这极大地提高了性能。
  • 负载均衡算法——ZeroMQ 采用了轮转调度算法。虽然该算法可以平均分配工作,但也有其局限性。比如,有两个数据中心,一个在伦敦,一个在纽约。在理想情况下,一个位于伦敦数据中心的网站,其请求不应该路由到纽约。但在ZeroMQ 的负载均衡算法里,这完全有可能。而 nanomsg 避免了这种情况的出现。

除此之外,文中还提到,nanomsg 提供了一个名为 nanocat 的命令行工具,用于与系统进行交互。

作者继续写道,nanomsg 旨在实现“可扩展协议(Scalability Protocols)”,用于构建可扩展的高性能分布式系统。当前,它定义了六种不同的可扩展协议:PAIR、REQREP、PIPELINE、BUS、PUBSUB 和 SURVEY。

既然 nanomsg 在 ZeroMQ 的基础上做了如此多的改进,那我们为什么还要用 ZeroMQ 呢?针对这个疑问,作者指出,nanomsg 还相对年轻,它还没有达到 ZeroMQ 的成熟度,没有像 ZeroMQ 那样有一个繁荣的开发者社区。另外,ZeroMQ 有丰富的文档及其它资源,可以帮助开发人员使用它,而 nanomsg 的文档非常少。

尽管如此,作者还是认为 nanomsg 所做的改进,尤其是它的可扩展协议,使它非常有吸引力。从技术上讲,从三月份开始,nanomsg 就已经开始 beta 测试,因此,生产就绪版本已经指日可待。


感谢郭蕾对本文的审校。

给InfoQ 中文站投稿或者参与内容翻译工作,请邮件至 editors@cn.infoq.com 。也欢迎大家通过新浪微博( @InfoQ )或者腾讯微博( @InfoQ )关注我们,并与我们的编辑和其他读者朋友交流。

2014 年 8 月 12 日 09:16 21580
用户头像

发布了 29 篇内容,共 651131 次阅读,收获喜欢 4 次。

关注

评论

发布
暂无评论
发现更多内容

nginx 实现接口版本控制

lockdown56

php nginx laravel Nginx PHP-FPM 版本控制

华为云推UGO:一手抓结构迁移,一手抓SQL转换

华为云开发者社区

众盟科技2020智能化白皮书:穿越新商业周期,读懂商业智能化的真义

脑极体

c++杂谈-1

菜鸟小sailor 🐕

c++

船长梁晓玲的猎鹰号真的能赚钱嘛?不分析不知道……

成周

心理学 船长梁晓玲 诈骗

新疆采风笔记:送行·出发·火车上

刘新吾

随笔 旅行 新疆

一个草根的日常杂碎(9月22日)

刘新吾

生活 随笔 记录

2020大厂面试一道高频Spring题,90%的Java开发者都拜倒在它脚下!

Java架构师迁哥

华为云IoT智简联接,开启物联世界新纪元

华为云开发者社区

物联网

golang 表格编程降低圈复杂度

猴子胖胖

golang 表格开发

时空碰撞优化系列·一

誓约·追光者

hive 数据分析 Sparksql 计算效率 优化

架构师训练营第 1 期 第 1 周作业

李循律(祥龙)

HTTP

ltc

HTTP

甲方日常 20

大橘子

工作 随笔杂谈 日常 Java 25 周年

阿里P8大牛的建议,工作1-5年的Java工程师如何让自己变得更值钱

Geek_71bb95

Java 编程 程序员 面试

“大数据+区块链”的智慧城市建设!

CECBC区块链专委会

区块链 大数据

高并发下为什么更喜欢进程内缓存

架构师修行之路

缓存 架构设计

(2)skynet ubuntu下载与安装

休比

深度解析物联网设备的区块链技术

CECBC区块链专委会

区块链 智能合约 物联网

数据库

ltc

数据库

时空碰撞优化系列·二

誓约·追光者

hive Sparksql 计算效率 优化

我把某大厂P8大牛手写的 Linux+网络编程 手册搞到手了

互联网架构师小马

Java Linux 程序员 网络编程 操作系统

从全备中恢复单库或单表,小心有坑!

Simon

MySQL mysqldump MySQL 运维

分布式系统实践解读丨详解高内聚低耦合

华为云开发者社区

一个线程池中的线程异常了,那么线程池会怎么处理这个线程?

Java架构师迁哥

flutter 高效开发工具集

Daniel

区块链用于支付手段只是开端

CECBC区块链专委会

区块链 金融

救人于无形的“环境智能”,到底是一种什么智能?

脑极体

添加字幕哪个视频剪辑软件比较简单?

Geek_96964a

视频创作 视频剪辑 视频后期 自媒体 后期字幕

知乎万赞,获得腾讯offer后自述,编程能力是如何突飞猛进的

周老师

Java 编程 程序员 架构 面试

判断一个请求是否是Ajax异步请求

麦叔

ajax

为什么ZeroMQ不应该成为你的第一选择-InfoQ