AMQP学习 & RabbitMQ 与 ActiveMQ、ZeroMQ以及Kafka的比较
之前写了一篇文章关于Active以及消息队列推拉模式的文章,可以参考:link
关于 Active 与 RabbitMQ以及其他的比较,有如下记录:
这篇文章 link 提到:
基本介绍
RabbitMQ:基于AMQP协议(Advanced Message Queue Protocol)
ActiveMQ:基于STOMP协议(注:我只知道是基于JMS)
注:更多AMQP的内容可以看这里:http://www.infoq.com/cn/articles/AMQP-RabbitMQ
高级消息队列协议(AMQP1)是一个异步消息传递所使用的应用层协议规范。作为线路层协议,而不是API(例如JMS2),AMQP客户端能够无视消息的来源任意发送和接受信息。
AMQP详解:http://kb.cnblogs.com/page/73759/
AMQP协议是一种二进制协议,提供客户端应用与消息中间件之间异步、安全、高效地交互。从整体来看,AMQP协议可划分为三层:
上面是对AMQP协议的大致说明。下面会以我们对消息服务的需求来理解AMQP所提供的域模型。消息中间件的主要功能是消息的路由(Routing)和缓存(Buffering)。在AMQP中提供类似功能的两种域模型:Exchange 和 Message queue。
更具体的协议学习看这里:http://www.cnblogs.com/charlesblc/p/6286875.html
rabbitMQ 是 AMQP 用 Erlang 实现的 MQ 。用 Erlang的原因(Erlang消息机制与AMQP极度吻合):
AMQP 主要是由金融领域的软件专家们贡献的创意,而联合了通讯和软件方面的力量,一起打造出来的规范。
【Contributors: JPMorgan Chase Bank & Co., Cisco Systems, Inc., Credit Suisse, Envoy Technologies Inc.,iMatix Corporation,
IONA Technologies, Rabbit Technologies Ltd., Red Hat, Inc., TWIST Process Innovations Ltd, and 29West, Inc.】
粗略的从概念上来讲 AMQP 首先满足的是金融系统的消息通讯业务需求。
这是一个可以和 JMS 进行类比的消息中间件开放规范,所不同的是 AMQP 同时定义了消息中间件的语意层面和协议层面;
另外一个不同是 AMQP 是语言中立的,而 JMS 仅和 Java 相关。
AMQP 在“语意层面的定义”,这就意味着,它并不仅仅是象 JMS 或者其他的 MQ 一样,仅能按照预定义的方式工作,而是“可编程”的消息中间件。
而“语言中立”则意味着只要遵循 AMQP 的协议,任何一种语言都可以开发消息组件乃至中间件本身。
比如说这样的场景:“Java 写的消息端(新的前端)通过 Erlang 写的消息中间件(基础设施)与 C 写的另外一个消息端(遗留系统)进行消息交互”。
AMQP 是一个开放标准,目前还在 0.9 版本。尚未成熟,但市场上已经出现了很多这个标准的实现产品。
在 AMQP 所描绘的美好前景下,我们可以这么设想将来构建在成熟之后构建在 AMQP 之上的金融系统。
前端程序员用他们熟悉的“工业语言”来构建系统中新的应用模块。后端程序员则继续用“老旧语言”在“遗产系统”上慢慢改进。
当然,金融系统需要他们赖以沟通消息互相调用的“基础设施”必须坚若磐石,为业界提供“高并发,易扩容”的产品,这似乎正是 Erlang 的强项。
之前听说“ Erlang 进入金融系统”,具体的事例,大概就是这件事了。
更具体一点(不甚懂):
主要因为erlang有七大优势,便于开发消息系统: 1. 分布式 在erlang中,集群是内嵌能力 2. 热代码升级 3. 内嵌进程监控 在任何一个节点都可以监控真个系统 4. 可预测的高速度 不会受到GC的停顿影响(FP的功劳) 5. 点对点 6. 企业级 7. 可移植
下面是一些指标比较(参考 link )
第一部分:ActiveMQ,RabbitMQ,ZeroMQ的比较
1、 TPS比较
ZeroMq 最好,RabbitMq 次之, ActiveMq 最差。
2. 持久化消息比较
zeroMq不支持,activeMq和rabbitMq都支持。
持久化消息主要是指:MQ down或者MQ所在的服务器down了,消息不会丢失的机制。
3. 技术点:可靠性、灵活的路由、集群、事务、高可用的队列、消息排序、问题追踪、可视化管理工具、插件系统、社区
RabbitMq最好,ActiveMq次之,ZeroMq最差。
当然ZeroMq也可以做到,不过自己必须手动写代码实现,代码量不小。尤其是可靠性中的:持久性、投递确认、发布者证实和高可用性。
所以在可靠性和可用性上,RabbitMQ是首选,虽然ActiveMQ也具备,但是它性能不及RabbitMQ。
4、高并发
从实现语言来看,RabbitMQ最高,原因是它的实现语言是天生具备高并发高可用的erlang语言。
第二部分:kafka和RabbitMQ的比较
1、 RabbitMq比kafka成熟,在可用性上,稳定性上,可靠性上,RabbitMq超过kafka
2、 Kafka设计的初衷就是处理日志的,可以看做是一个日志系统,针对性很强,所以它并没有具备一个成熟MQ应该具备的特性
3、 Kafka的性能(吞吐量、tps)比RabbitMq要强,这篇文章的作者认为,两者在这方面没有可比性。
另外,有这篇PPT讲了Rabbit的一些优点和选型的考虑:link
PPT已下载,位置:/Users/baidu/Documents/Data/Interview/存储-Nosql-Redis-消息队列/我为什么要选择RabbitMQ.pptx
(完)