以前一直在使用ZeroMQ库处理通信,但因为最近需要做一个一对多的双向实时通信,ZeroMQ提供的几种通信模式就难以很好地实现,于是就去寻找其他的库,比如NanoMsg库。
在我实际使用中,这两个库有着很大不同,下面我列出几点我使用时最注意的几点,之后如有新的理解再更新。
按照官方的说明,NanoMsg相当于ZeroMQ的改进升级版。
官方对两者的比较说明:Differences between nanomsg and ZeroMQ,CSDN上译文:[译]nanomsg和ZeroMQ的区别
外网博客:A Look at Nanomsg and Scalability Protocols (Why ZeroMQ Shouldn’t Be Your First Choice),本站转载译文:【转载】谈谈Nanomsg和可扩展性协议(为什么ZeroMQ不应该是你的首选)
-
性能方面,我没细致测试,同种情况的实时通信延迟相差不大,性能相差甚微。
-
ZMQ使用C++编写,而NanoMsg是用C。NanoMsg在内存分配、移植性等地方更佳,但也因此难读懂源码。
-
NanoMsg与ZMQ的缓存使用不一样,最直接的区别是,NanoMsg在传输大文件时需要手动设置更大的接受缓存。
-
API使用差不多,但NanoMsg取消了ZMQ的上下文机制,使用更加简洁。
ZeroMQ nanomsg zmq_socket
nn_socket
zmq_bind
nn_bind
zmq_connect
nn_connect
zmq_send
nn_send
zmq_recv
nn_recv
zmq_close
nn_close
zmq_ctx_new
– zmq_ctx_destroy
– -
最重要的是NanoMsg增加很多通信模式,这一点是我选择NanoMsg的重要原因。关于这两个库的各种通信模式我之后再写篇文章细细讲讲。
如果要实现一对多通信,ZMQ使用Request-Reply (请求-应答) 模式一连多时,数据是轮流发送,不是一份数据发送多份, Publish-Subscribe (发布-订阅) 模式则不支持回应。而NanoMsg新增了BUS模式和SURVEY模式:
- BUS (总线)模式实现多个节点之间的广播通信。每个节点可以发送和接收消息,消息是在一个BUS(总线)里,即节点发送的信息其他节点都能接收到。
- SURVEY (调查/投票)模式允许一个节点向多个节点发送调查消息,并收集所有的回应,适用于需要从多个节点收集信息或进行投票的场景。