nanomsg - zmq 的华丽转身

开始之前先简单说明一下,对 zmq 不熟悉的同学可以看这篇 (中文,需翻墙)文章了解一下。nanomsg 是其作者两年前开始设计和实现的下一代 zmq,因为基本上完全 re-engineer 了,所以名字也变了。

这是一篇快速笔记,原文标题为 Differences between nanomsg and ZeroMQ(原文链接)。我在泛读此文时,本来计划是把它简明地摘录一下,因为读来深觉其文(包括其引用的各篇文章)信息量较大,充满了作者对之前的开源作品 zmq 的经验教训的各种提炼和反思,不是那种可以快速压缩成三两句干货的水文,于是边读边记录下了原文的要点,以备自己日后参考。

[GL] 开头的行,都是我夹带的私货,见谅。

POSIX 兼容性的实现 (与zmq不同,nanomsg 目标是保持完全的 POSIX 兼容性)

  • 发送/接收函数的语法和语义与POSIX一致
  • Context这个概念被去掉了,掉了...
  • Sockets由void*改为int (句柄化)
  • [GL] 我能说 zmq 原本就只有三个核心概念(context/socket/message)吗,这就嗖的一声干掉了一个。
  • [GL] 再一次印证了zmq doc里一句点32个赞的话:"We add power by removing complexity rather than exposing new functionality."

与使用C++的zmq不同的是,nanomsg使用C实现

  • 不依赖 C++ runtime 降低了内存需求总量和内存分配的数量
  • 从效果上看,降低了内存碎片程度,提高了缓存命中率
  • [GL] 至于为什么从C++转向C,作者写了两篇雄文(这里这里)还是蛮值得一读的
  • [GL] 对了,上面两篇文章大半价值都在下面的评论里,粗粗过滤一下水分,还是蛮精彩的,特此说明一下。

更方便扩展的传输协议

  • transportprotocol 相关的实现被单独提到两个对应的头文件里,并提供标准API支持
  • 已经有一些新的 protocol 在实现中(SURVEY / BUS 等)
  • [GL] 可以想见的是,有了标准API,会有 user-defined protocol 逐步出现,值得期待。

线程模型改进

  • zmq 有一个基本设计是为库内每个独立对象维护一个 worker thread,这个设计带来了很多局限性,新的设计是核心对象不再和特定线程绑定
  • 在 nanomsg 里面 REQ 支持 retry, REQ/REP 支持 cancelling
  • inproc 协议使用起来,行为(bind, auto-reconnect)跟其他的协议也更一致了
  • 在新的线程模型下,nanomsg 正在尝试实现 thread-safe socket
  • [GL] 其实我倒觉得实践中这个帮助不大,有了zmq里大量定义良好的协议组合,不同线程混合读写一个 socket 几乎可以看作是一种 bad smell 了。

IOCP 的支持

  • 在 Windows 平台上酌情使用 iocp/NamedPipes 提高性能,而不是始终使用 BSD socket
  • [GL] 优雅的抽象重要,群众的呼声更重要啊。

Routing 优先级的支持

  • 就是往外发的消息在一些特定情况下可以 fallback 到不同的目标去

其他小改进

  • tcp 连接可以指定具体的本地接口("tcp://eth0;192.168.0.111:5555")
  • 全库范围 DNS 查询异步实现
  • 真正的零拷贝 (zmq只保证到内核边界前是零拷贝)
  • PUB/SUB 协议在150M量级的订阅情况下性能改进

协议层的设计改进

  • 不同协议之间被完全隔离(比如REQ和PUB是不互通的)
  • 协议的完整行为被规范化(spec 在 rfc 目录),目标是被 IETF 标准化
  • [GL] 野心很大啊,这是要在通讯协议上一桶浆糊的架势啊。

总的来看(不知道为啥,差点鬼使神差地打出“太史公曰”四个字),nanomsg 作为一个进化版的 ZMQ,(至少看起来)是相当有诚意的。经过多年的发展和简化(注意,不是演化,是简化),zmq 已经在"结构简单"和"功能强大"之间有了令人发指的平衡了,因此上俺对 nanomsg 的后续还是非常期待的。话说 nanomsg 是真的还在 beta 早期吗,这货只出过 0.1-alpha,0.2-alpha,0.3-beta 这区区三个版本,已经有了15种语言的绑定了。这"0.3-beta"的版本号和网页上无所不在的"WARNING: nanomsg is still in beta stage!"是要闹哪样?俺深深地迷惑了。

[完]
Gu Lu
[2014-06-08]

知识共享许可协议
本作品由Gu Lu创作,采用知识共享Attribution-NonCommercial-NoDerivatives 4.0 国际许可协议进行许可。