一、RabbitMQ简介
RabbitMQ是实现了高级消息队列协议(AMQP)的开源消息代理软件(亦称面向消息的中间件)。RabbitMQ服务器是用Erlang语言编写的,而群集和故障转移是构建在开放电信平台框架上的。所有主要的编程语言均有与代理接口通讯的客户端库。
二、优势
1、应用解耦
系统的耦合度越高,容错越低,可维护性就越低。引入MQ之后,使应用之间解耦,提成容错和可维护性。
2、异步提速
提升用户体验和系统吞吐量(单位时间内处理请求的数量)。
3、削峰填谷
使用MQ后,限制消费消息的速度为1000,这样一来,高峰期产生的数据肯定会积压在MQ中,高峰就被“削”掉了,但是因为消息积压,在高峰期过后的一段时间内,消费消息的速度还是会维持在1000,知道消费完积压的消息,这就叫“填谷”。使用MQ后,可以提高系统的稳定性。
三、劣势
1、系统可用性降低
系统引入的外部依赖越多,系统稳定性越差。一旦MQ宕机,就会对业务造成影响。如何保证MQ的高可用
2、系统复杂度增加
MQ的加入大大增大的系统的复杂度,以前系统之间是同步的远程调用,现在是通过MQ异步调用,如何保证消息没有被重复消费?怎么处理消息丢失情况?如何保证消息传递的顺序性?
3、一致性问题
A系统处理完业务,通过MQ给B/C/D三个系统发送数据,如果B/C成功,D处理失败,如何保证消息数据处理一致性?
四、小结
- 生产者不需要从消费者除获得反馈。引入消息队列之前的直接调用,其接口返回值应为空,这才让明明下层的动作还没执行,上层确当成动作执行完继续往后执行,即所谓异步成了可能。
- 允许短暂的不一致性
- 解耦、提速、削峰等方面的收益,超过加入MQ、管理MQ的成本。
RabbitMQ |
ActiveMQ |
RocketMQ |
Kafka |
|
公司/社区 |
Rabbit |
Apache |
阿里 |
Apache |
开发语言 |
Erlang |
Java |
Java |
Scala&Java |
协议支持 |
AMQP,XMPP,SMTP,STOMP |
OpenWire,STOMP,REST,XMPP,AMQP |
自定义 |
自定义协议,社区封装了http协议支持 |
客户端支持语言 |
官方支持Erlang、Java、Ruby等,社区产出多种API,几乎支持所有语言 |
Java,C,C++,Python,PHP,Perl,.NET等 |
Java,C++(不成熟) |
官方支持Java,社区产出多种API,如PHP/Python等 |
单机吞吐量 |
万级(其次) |
万级(最差) |
十万级(最好) |
十万级(次之) |
消息延迟 |
微秒级 |
毫秒级 |
毫秒级 |
毫秒以内 |
功能特性 |
并发能力强,性能及其好,延迟低,社区活跃,管理界面丰富 |
成熟度高,文档较多 |
MQ功能比较完备,扩展性佳 |
只支持主要的MQ功能,毕竟视为大数据领域准备的。 |