1.MQ相关概念
1.1 什么是MQ
MQ(message queue),从字面意思上看,本质是个队列,FIFO 先入先出,只不过队列中存放的内容是
message 而已,还是一种跨进程的通信机制,用于上下游传递消息
1.2 为什么使用MQ
流量削峰
-
处理能力有限,如果只能处理1W请求,1W的之内都能即时响应,现在由于活动2W用户请求,不能放弃掉1W用户,所以消息可以到消息队列,只不过处理用户下单的时间比之前长
应用解耦
异步处理
-
有些服务间调用是异步的
-
例如 A 调用 B,B 需要花费很长时间执行,但是 A 需要知道 B 什么时候可以执行完,
-
以前一般有两种方式:
-
A 过一段时间去调用 B 的查询 api 查询
-
或者 A 提供一个 callback api,B 执行完之后调用 api 通知 A 服务
-
-
这两种方式都不是很优雅,使用消息总线,可以很方便解决这个问题
-
A 调用 B 服务后,只需要监听 B 处理完成的消息
-
当 B 处理完成后,会发送一条消息给 MQ,MQ 会将此消息转发给 A 服务
-
1.3 常用MQ优缺点
ActiveMQ
-
优点:单机吞吐量万级,时效性 ms 级,可用性高,基于主从架构实现高可用性,消息可靠性较低的概率丢失数据
-
缺点:官方社区现在对 ActiveMQ 5.x 维护越来越少,高吞吐量场景较少使用
Kafka
-
优点:
-
性能卓越,单机写入 TPS 约在百万条/秒,最大的优点,就是吞吐量高。
-
时效性 ms 级可用性非常高
-
kafka 是分布式的,一个数据多个副本,少数机器宕机,不会丢失数据,不会导致不可用
-
消费者采 用 Pull 方式获取消息, 消息有序, 通过控制能够保证所有消息被消费且仅被消费一次
-
有优秀的第三方Kafka Web 管理界面 Kafka-Manager
-
在日志领域比较成熟,被多家公司和多个开源项目使用
-
-
缺点:
-
功能较为简单,主要支持简单的 MQ 功能,在大数据领域的实时计算以及日志采集被大规模使用
-
社区更新较慢;
-
RocketMQ
-
RocketMQ 出自阿里巴巴的开源产品,用 Java 语言实现,在设计时参考了 Kafka,并做出了自己的一 些改进。被阿里巴巴广泛应用在订单,交易,充值,流计算,消息推送,日志流式处理,binglog 分发等场景
-
优点:
-
单机吞吐量十万级,可用性非常高
-
分布式架构,消息可以做到 0 丢失
-
MQ 功能较为完善,还是分布式的,扩展性好
-
支持 10 亿级别的消息堆积,不会因为堆积导致性能下降,源码是 java 我们可以自己阅读源码
-
-
缺点:
-
支持的客户端语言不多,目前是 java 及 c++,其中 c++不成熟
-
社区活跃度一般,没有在 MQ 核心中去实现 JMS 等接口,有些系统要迁移需要修改大量代码
-
RabbitMQ
-
2007 年发布,是一个在 AMQP(高级消息队列协议)基础上完成的,可复用的企业消息系统,是