转载:http://www.infoq.com/cn/news/2010/09/introduction-zero-mq
Ilya Grigorik,即PostRank的创始人兼CTO,为ZeroMQ写了个简介如下:
所有网络交互所使用的API实际上是Berkeley套接字(BSD) 。这个源自1980年代早期的协议是TCP/IP协议的最原始实现。而且可以说,在当今各操作系统中,它是受到最广泛支持的API,也是这些操作系统的核心组件之一。人们对BSD套接字的了解较多的是点对点的连接。点对点连接需要显式地建立连接、销毁连接、选择协议(TCP/UDP)和处理错误等。一旦你解决了以上所有问题,你就进入应用协议层(如HTTP)的世界了,这里需要的是组帧、缓存和处理逻辑等。换言之,编写高性能网络协议的应用程序一点儿也不复杂。
他补充:
如果我们能对各种套接字类型、连接处理、帧、甚至路由的底层细节进行抽象,这不是件很好的事情吗?这正是 ZeroMQ(ØMQ/ZMQ)网络库的由来:“它提供一些跨多种传输协议(如进程内通讯、IPC、TCP和广播)的套接字供你使用。你可使用多种方式实现N对N的套接字连接,譬如:扇出、发布订阅、任务分发以及请求响应。”
ØMQ是网络栈中新的一层,它是个可伸缩层,分散在分布式系统间。因此,它可支持任意大的应用程序。ØMQ不是简单的点对点交互,相反,它定义了分布式系统的全局拓扑。ØMQ应用程序没有锁,可并行运行。此外,它可在多个线程、内核和主机盒之间弹性伸缩。
ZeroMQ是由社区推动的:
ØMQ(又称作ZeroMQ或0MQ)是由 数十位作者历时三年合作开发出来的 自由软件。
Ilya解释:
- ZeroMQ交互是面向消息的。它将人们每天为应用程序周而复始地进行的例行消息处理封装起来。这意味着如果当客户端套接字发送一条150KB大小的消息时,服务端套接字无需显式处理任何缓存(buffer)或组帧,即能接接收到一条完整而相同的消息。
- ZeroMQ套接字与传输协议无关:对于任何协议,只有单一且统一的发送消息和接收消息API。缺省情况下支持进程内通讯、IPC、广播和TCP。此外,协议间切换非常简单,仅需更改连接字符串的前缀即可。
- ZeroMQ套接字能感知路由和网络拓扑。因为我们不再需要显示地管理点对点的连接状态——在上面我们已经看到,所有这些都已经由ZeroMQ库封装好——所以单个ZeroMQ套接字可以绑定两个独立的端口并监听他们的入站请求消息;也可使用一个API调用向两个独立的套接字发送数据。
Ilya补充解释:
缺省情况下,ZeroMQ中所有的交互都是异步的。这种异步处理模型使得ZeroMQ能够将建立连接、销毁连接、重新连接的过程封装起来,同时又能实现消息传输延迟的最小化:非阻塞的含义是,应用中一般的消息处理都是并行进行的,如消息的发送、传输以及(在发送端或接收端)排队。当然,你也可以控制ZeroMQ的排队行为,只需要设定内存范围即可,甚至你还可以为每个套接字设定交换区域。所以,如果需要的话,你完全可以模拟阻塞式API,但是异步I/O是缺省的行为。
Mongrel2是使用ZeroMQ的一个Web服务器。Ilya解释:
Mongrel2给出了将ZeroMQ应用于Web服务器的一个有趣的案例研究:所有入站消息通过“Push”套接字路由到Mongrel2,套接字可以自动实现负载均衡,将消息分发到连接处理器。反过来,连接处理器处理入站消息(通过Pull套接字),然后将处理结果发布到一个“Pub”套接字,Mongrel2服务器本身已订阅了该套接字,并且通过主题(topic)过滤器监听该套接字的进程号。
ZeroMQ网站上给出了一个列表,简要给出了ZeroMQ较之其他传输机制的优势:
- TCP:ZeroMQ基于消息,消息模式,而非字节流。
- XMPP:ZeroMQ更简单、快速、更底层。Jabber可建在ØMQ之上。
- AMQP:完成相同的工作,ZeroMQ要快100倍,而且不需要代理(规范更简洁——少278页)
- IPC:ZeroMQ可以跨多个主机盒,而非单台机器。
- CORBA:ZeroMQ不会将复杂到恐怖的消息格式强加于你。
- RPC:ZeroMQ完全是异步的,你可以随时增加/删除参与者。
- RFC 1149:ZeroMQ比它快多了!
- 29west LBM:ZeroMQ是自由软件!
- IBM低延迟:ZeroMQ是自由软件!
- Tibco:仍然是自由软件!
Ilya总结:
无需多说,ZeroMQ是一个雄心满满项目,该简介对于完整的特性集而言只能略见一斑。ZeroMQ的明确目标是“成为标准网络协议栈的一部分,之后进入Linux内核”,现在还未看到它们的成功。但是,它无疑是极具前景的、并且是人们更加需要的“传统”BSD套接字之上的一层封装。 ZeroMQ让编写高性能网络应用程序极为简单和有趣。
ZeroMQ的确非常强大,除了快速和高效之外,它还大大简化了应用程序交互层的设计。此外,它还使得在多种场景下重用相同的交互模式成为可能。 然而,在我看来,ZeroMQ应该被看作RabbitMQ之类的队列系统的补充,而不是替代品。与任何其他软件系统一样,仔细分析应用程序的需求就能让更加清楚哪种交互机制才是解决问题的最佳之选。
你在使用ZeroMQ吗?你如何看待它呢?
查看英文原文:An Introduction to ØMQ (ZeroMQ)