ZeroMQ阅读笔记

来源:互联网 发布:数据库营销成功案例 编辑:程序博客网 时间:2024/06/05 22:37

ZeroMQ是一种基于消息队列的多线程网络库,提供跨越多种传输协议的套接字。ZeroMQ是网络通信中新的一层,介于应用层和传输层之间。

ZeroMQ整体架构图如下:



ZeroMQ的主要特性是面向消息进行通信,所以它提供的是比Libevent处在网络通信中更高一层的组件,如果程序员要使用ZeroMQ,只需要做如下事情:

  • 告知所使用的通信模型,比如请求回应模型(Request-Reply)、发布订阅模型(Publish-Subscribe)、推拉模型(Push-Pull)等
  • 告知是用于机器之间,还是进程之间或线程之间的通信

然后程序员自己负责如何序列化/反序列化,最后将序列化后的数据交给ZeroMQ发送处理即可。


通过阅读ZeroMQ的源码,给我最深刻的印象就是ZeroMQ几乎所有的I/O操作都是异步的,主线程不会被阻塞。ZeroMQ设计之初就是为了高性能的消息发送而服务的,所以其设计追求简洁高效,异步模式的体现在:

  • 传统的socket的connect函数为同步阻塞的,而ZeroMQ中设置成非阻塞的异步连接,调用zmq_connect方法返回并不代表连接就已经成功,由后台的I/O线程异步地进行,实际是由tcp_connecter_t执行真正的连接。
  • 调用zmq_send()方法时其实并没有真正将消息发送给套接字连接。消息会在一个内存队列中保存下来,并由后台的I/O线程异步地进行发送。如果不出意外情况,这一行为是非阻塞的。所以说,即便zmq_send()有返回值,并不能代表消息已经发送。当你在用zmq_msg_init_data()初始化消息后,你不能重用或是释放这条消息,否则ZMQ的I/O线程会认为它在传输垃圾数据。
  • ZeroMQ内部发送和接收消息时都并非同步执行的,待发送和接收的消息会分别在缓存在读写通道pipe中,最后触发poll读写事件。
  • ZeroMQ中应用层与IO线程之间的交互是通过command_t的命令对象的Lock-free的ypipe_t队列实现线程间通信。

它发送消息是异步模式,通过单独出一个IO线程来实现,所以消息发送调用之后不要立刻释放相关资源,要把资源释放函数交给ZeroMQ让ZeroMQ发完消息自己释放。

未完待续。。。




0 0