开始之前先简单说明一下,对 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

Comments
Write a Comment
  • JackyW reply

    期待看到有关于这个项目的更多更新!:)

Tags

游戏开发   随笔   Programming   C/C++   优化   Unity   C++   知乎   游戏设计   比特币   Unity3D   区块链   软件开发   引擎设计   系统架构   Production   idtech   中国文化   加密货币   项目管理   Bitcoin   游戏评论   资源管理   资源流水线   效率   道德经   网络   方法论   模板编程   Blockchain   Lua   Blockchain Computing   Oculus   GDC   渲染   VR   PerfAssist   Unity MemoryProfiler   BCH   经济学   信息过载   行业报告   字体   Productivity   图形   网络编程   Dice   协程   EMC   Premake   测试   中间件   Game Engine   新手引导   区块链游戏   Methodology   CI   命令行解析   goroutine   ndk   Ethereum   nanomsg   自动化   Scripting   摘录   Debugging   同步技术   cppcon   C++模板   DOOM3   技术评估   Unity GC   C++11   学习方法   Surface Pro 3   Engine Evaluation   CRT   文化   笔记   golang   图形编程   多线程   ETH   Bitcoin Cash   cppcon14   Bitcoin SV   Visual Studio   Unity Coroutine   跨语言可变参数列表   团队协作   货币   Deployment   Visual Assist   工程改进   Michael Abrash   exp   开放世界   域名   虚拟现实   系统重构   slua   遮挡剔除   完美转发   协作式调度   Modern C++   类型推导   Memory Debugging   个人成长   小故事   BTC   暴雪   产品   历史   错误处理   Unity Profiler   MOD  

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