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)关注咱们,并与咱们的编辑和其余读者朋友交流。