1.作用:异步(提高系统的响应速度和吞吐量),解耦(可以实现数据分发),削峰(以稳定的系统应对突发的流量冲击)
2.缺点:系统的可用性降低,MQ宕机导致不可用。系统的复杂性提高,如何保证消息不丢失。数据一致性:A系统发消息,BC同时处理,B成功C失败,数据一致性如何保证。
3.选型:Kafka(吞吐量大,性能好,集群高可用,会丢数据,功能单一)
RabbitMQ(消息可靠性高,功能全面,吞吐量低,消息积累会严重影响性能,erlang语言不好定制,小规模项目)
RocketMQ(高吞吐,高可用,功能非常全面,开源版不如商业版,生态不够成熟,只支持Java, 几乎覆盖全场景)
4.保证消息不丢失: 考虑跨网络
1. 生产者发送到MQ丢失:
Kafka: (1)消息发送+回调
RocketMQ: (1)消息发送+回调 (2)消息事务
RabbiltMQ: (1)消息发送+回调 (2)手动事务 channel.txSelect() channel.txCommit() channel.txRollback() channel会发生阻塞,造成吞吐量下降。(3) Publish Confirm
2. MQ主从同步丢失: (1) 同步同步:主->从->确认 (2) 异步同步:主->确认 异步同步 Dledger集群 至少要3个节点 大多数节点确认
3. 内存会断电丢失,会存硬盘。消息写入内存,没写入硬盘 同步刷盘,异步刷盘
4. 消费者消费丢失
5. 设计一个MQ
(1) 实现一个单机的队列数据结构,高效,可扩展。
(2) 将单机队列扩展成为分布式队列,分布式集群管理。
(3) 基于topic定制消息路由策略, 发送者路由策略,消费者与队列对应关系,消费者路由策略。
(4) 实现高效的网络通信。 Netty Http
(5) 规划日志文件,实现文件高效读写。零拷贝,顺序写。服务重启后,快速还原运行现场。
(6) 定制高级功能,死信队列,延迟队列,事务消息等。