消息队列入门(二)消息队列的开源实现
关于AMQP
AMQP 是 Advanced Message Queuing Protocol,即高级消息队列协议。AMQP不是一个具体的消息队列实现,而 是一个标准化的消息中间件协议。目标是让不同语言,不同系统的应用互相通信,并提供一个简单统一的模型和编程接口。
目前主流的ActiveMQ和RabbitMQ都支持AMQP协议。
AMQP相关的角色和职责
Producer 消息生产者
一个给exchange发送消息的程序,发送方式大致是:它首先创建一个空消息,然后填上内容、路由KEY,最后发送给exchange
Routing Key 消息特征
一个字符串,exchange用之来决定应该该消息投递给哪个queue。(开始时queue已向exchange绑定它所关心消息的routingKey)
Exchange 交换器
接收来自producers的消息,并根据该消息的routingKey,将该消息投递到正确的queues
Binding 绑定操作
前期将queue所想要的消息特征告诉exchange。Exchange以后收到消息,就按照这个规则来投递
Queue 消息容器
在MQ server(实现为broker方式)里面的queue,持有Consumer想要的消息
Consumer 消息接收者
从MQ server得到想要的消息,它负责创建、主动订阅、共享、使用、破坏queue和binding
ActiveMQ
ActiveMQ 是Apache出品,目前非常流行的开源消息中间件。ActiveMQ 支持JMS规范,同样也支持AMQP协议。
在下面的博客里,将会较深入的学习ActiveMQ的设计和应用。
RabbitMQ
RabbitMQ 是由 LShift 提供的一个 Advanced Message Queuing Protocol (AMQP) 的开源实现,开发语言是以高性能、健壮以及可伸缩性出名的 Erlang 。
RocketMQ
RocketMQ 是阿里的一款分布式、队列模型的消息中间件。
项目地址 https://github.com/alibaba/RocketMQ
软件文档 https://github.com/alibaba/RocketMQ/wiki
三种消息队列的比较
摘自 各种消息队列对比
ActiveMQ
优点:成熟的产品,已经在很多公司得到应用(非大规模场景)。有较多的文档。 各种协议支持较好,有多重语言的成熟的客户端;
缺点:根据其他用户反馈,会出莫名其妙的问题,会丢失消息。其重心放到activemq6.0产品—apollo上去了,目前社区不活跃,且对 5.x 维护
较少;Activemq 不适合用于上千个队列的应用场景
RabbitMQ
优点:由于erlang语言的特性, mq性能较好;管理界面较丰富,在互联网公司也有较大规模的应用;支持 amqp 系诶,有多中语言且支持amqp 的客户端可用
缺点:erlang语言难度较大。集群不支持动态扩展。
RocketMq
优点:模型简单,接口易用(JMS的接口很多场合并不太实用)。 在阿里大规模应用。 目前支付宝中的余额宝等新兴产品均使用rocketmq。
集群规模大概在50 台左右,单日处理消息上百亿;性能非常好,可以大量堆积消息在broker 中;支持多种消费,包括集群消费、广播消费等。 开发度较活跃,版本更新很快。
缺点:产品较新,文档比较缺乏。没有在 mq核心中去实现JMS 等接口,对已有系统而言不能兼容。阿里内部还有一套未开源的 MQ API,这一层 API可以将上层应用和下层 MQ 的实现
解耦。