ZeroMQ 简介

ZeroMQ(又写作 ØMQ、0MQ 或 zmq)是一个可嵌入的网络库,但使用起来更像是一个并行开发框架(concurrency framework)。它能够提供进程间(in-process)、进程内(inter-process)、网络(TCP)和广播方式的消息信道,并支持扇出(fan-out)、发布-订阅(pub-sub)、任务分发(task distribution)、请求-响应(request-reply)等几种多对多的通信模式。

ZeroMQ 的性能足以用来构建集群产品,其异步 I/O 模型能够为多核消息系统提供足够的扩展性。ZeroMQ 支持 30 多种语言的 API,可以用于绝大多数操作系统。在提供这些优秀特性的同时,ZeroMQ 是开源的,遵循 LGPLv3 许可。

ZeroMQ 的明确目标是“成为标准网络协议栈的一部分,之后进入 Linux 内核”。

设计原则

ZeroMQ 是一个很有个性的项目,其名称也暗合禅意:

  • Ø 是一种权衡:让一些丹麦人恼火,但是“Ø”本身也降低了 Google 搜索的命中率以及 Twitter 上的关注度;
  • Ø 暗合“零代理(broker)”、“零延迟”;
  • Ø 的目标是“零管理、零消耗、零浪费”;
  • Ø 符合简约主义:力量的源泉是降低复杂度,而不是增加新功能。

功能特点

尽管 ZeroMQ 的名字中包含了“MQ”,但它并不是完整意义上的“消息队列/消息中间件”。ZeroMQ 更像是一个传输层 API 库,更关注消息的传输,其最大的特点不在性能,而是机制。与消息队列相比,ZeroMQ 有以下一些特点:

  • 点对点无中间节点

    传统的消息队列都需要一个消息服务器来存储转发消息。而 ZeroMQ 则放弃了这个模式,把侧重点放在了点对点的消息传输上,并且(试图)做到极致。以为消息服务器最终还是转化为服务器对其他节点的点对点消息传输上。ZeroMQ 能缓存消息,但是是在发送端缓存。ZeroMQ 里有水位设置的相关接口来控制缓存量。当然,ZeroMQ 也支持传统的消息队列(通过 zmq_device 来实现)。

  • 强调消息收发模式

    在点对点的消息传输上,ZeroMQ 将通信的模式做了归纳,比如常见的订阅模式(一个消息发多个客户),分发模式(N 个消息平均分给 X 个客户)等等。下面是目前支持的消息模式配对,任何一方都可以做为服务端。

    • PUB and SUB
    • REQ and REP
    • REQ and XREP
    • XREQ and REP
    • XREQ and XREP
    • XREQ and XREQ
    • XREP and XREP
    • PUSH and PULL
    • PAIR and PAIR
  • 以统一接口支持多种底层通信方式

    不管是线程间通信、进程间通信还是跨主机通信,ZeroMQ 都使用同一套 API 进行调用,只需要更改通信协议名称即可。例如,从 "ipc:///xxx" 改为 "tcp://*.*.*.*:****")即可。

  • 异步,强调性能

    ZeroMQ 设计之初就是为了高性能的消息发送而服务的,所以其设计追求简洁高效。它发送消息是异步模式,通过单独出一个 IO 线程来实现,所以消息发送调用之后不要立刻释放相关资源哦,会出错的(以为还没发送完),要把资源释放函数交给 ZeroMQ,让ZeroMQ 发完消息自己释放。

总的来说,我们可以把 ZeroMQ 看作是一个智能传输层,而不仅仅是对 socket 的封装,因为 ZeroMQ 内部提供了一套自己的协议,实现扇出(fan-out)、发布-订阅(pub-sub)、任务分发(task distribution)、请求-响应(request-reply)等通信模式。

应用案例

由于 ZeroMQ 的强大,我们可以用 ZeroMQ 搭建出非常强悍的应用。比如:

  • Salt 的底层就使用了 ZeroMQ 作为通信机制
  • Mongrel2 是使用 ZeroMQ 开发的一个 Web 服务器

ZeroMQ 带来了一种新的分布式应用架构的思考方式。善用 ZeroMQ,可以为应用带来非常强大的特性。

相关链接