zeroMQ不是TCP,不是socket,也不是消息队列,而是这些的综合体。
zeroMQ不是TCP,不是socket,也不是消息队列,而是这些的综合体。
ZeroMQ
ZeroMQ以嵌入式网络编程库的形式实现了一个并行开发框架(concurrency framework),
能够提供进程内(inproc)、进程间(IPC)、网络(TCP)和广播方式的消息信道,
并支持扇出(fan-out)、发布-订阅(pub-sub)、任务分发(task distribution)、请求/响应(request-reply)等通信模式。
ZeroMQ的性能足以用来构建集群产品,
其异步I/O模型能够为多核消息系统提供足够的扩展性。
ZeroMQ支持30多种语言的API,可以用于绝大多数操作系统。
在提供这些优秀特性的同时,ZeroMQ是开源的,遵循LGPLv3许可。
ZeroMQ的明确目标是“成为标准网络协议栈的一部分,之后进入Linux内核”。
ZeroMQ是一个很有个性的项目,其名称也暗合禅意:
与libevent, ACE等项目不同,使用ZeroMQ时可以不关注网络细节。
ZeroMQ的API提供了对于传统socket API的封装,对于套接字类型、连接处理、帧、甚至路由的底层细节都进行了抽象,
使得一套API可以用于进程内通讯、IPC、TCP和广播等多种消息信道。
ZeroMQ自己定位为“智能传输层”(The Intelligent Transport Layer),位于网络层和应用层之间。
ZeroMQ使得构建大型并发应用时,可以将基本单元随意的“组装”,由ZeroMQ解决通信的弹性伸缩,
ZeroMQ的这种设计大大简化了应用程序消息通信的实现,使得在多种场景下重用相同的交互模式成为可能。
使用ZeroMQ可以让编写高性能网络应用程序极为简单和有趣。
与socket相比,ZeroMQ API的特征如下:
ZeroMQ定义了ZMTP(ZeroMQ Message Transport Protocol, ZeroMQ消息传输协议),在TCP协议之上定义了向后兼容性的规则,可扩展的安全机制,命令和消息分帧,连接元数据,以及其他传输层功能。
相对于其他的消息传输协议/通信协议,ZeroMQ有明显的优势:
在摩尔定律的魔咒下,“分布式处理”逐渐成为主流,随之而来的是关于消息通讯、消息中间件的项目层出不穷。
其中最有名的应该是ZeroMQ和RabbitMQ,Thrift。
RabbitMQ是符合AMQP(Advanced Message Queuing Protocol, 高级消息队列协议)的消息中间件,
而Thrift是出自于Facebook的跨语言服务访问的框架。
2011年,欧洲核子研究组织(CERN)
调查了统一用于操作CERN加速器的中间件解决方案的方式,欧洲核子研究组织的研究比较了
CORBA、
Ice,
Thrift,
ZeroMQ,
YAMI4,
RTI和
Qpid/AMQP,
ZeroMQ得到了最高的分数。
但ZeroMQ最大的特点不在性能,而是机制。尽管名字中包含了"MQ",但ZeroMQ并不是“消息队列/消息中间件”。ZeroMQ是一个传输层API库,
更关注消息的传输。与消息队列相比,ZeroMQ有以下一些特点:
1 点对点无中间节点
传统的消息队列都需要一个消息服务器来存储转发消息。而ZeroMQ则放弃了这个模式,把侧重点放在了点对点的消息传输上,并且(试图)做到极致。以为消息服务器最终还是转化为服务器对其他节点的点对点消息传输上。ZeroMQ能缓存消息,但是是在发送端缓存。ZeroMQ里有水位设置的相关接口来控制缓存量。当然,ZeroMQ也支持传统的消息队列(通过zmq_device来实现)。
2 强调消息收发模式
在点对点的消息传输上ZeroMQ将通信的模式做了归纳,比如常见的订阅模式(一个消息发多个客户),分发模式(N个消息平均分给X个客户)等等。下面是目前支持的消息模式配对,任何一方都可以做为服务端。
3 以统一接口支持多种底层通信方式
不管是线程间通信,进程间通信还是跨主机通信,ZeroMQ都使用同一套API进行调用,只需要更改通信协议名称(如,从"ipc:///xxx"改为"tcp://...