场景——MQ
一、RocketMQ 消息0丢失,如何实现?
RocketMQ 消息的传递过程分为三个阶段:
- 生产阶段:Producer 发送消息到 Broker,可能因网络抖动或 Broker 故障导致消息丢失;
- 存储阶段:Broker 将消息存储到磁盘,可能因刷盘策略不当或服务器宕机导致消息丢失;主从同步时,可能丢失;
- 消费阶段:Consume r从 Broker 拉取消息,可能因消费失败或超时导致消息丢失;
生产阶段:
- 同步发送:Producer 发送消息后会阻塞等待 Broker 的响应,确保消息成功投递并持久化;
-
处理发送超时与异常:本地消息表 + 定时扫描,本地消息表记录消息发送状态,定时扫描未确认的消息并进行重试;
存储阶段:
- 同步刷盘:设置 Broker的 刷盘策略为同步刷盘,确保消息写入内存后立即持久化到磁盘;
-
副本同步机制:设置 Broker 的副本同步机制为同步复制,确保消息在 Master 和 Slave 节点都存储成功后才返回响应;
消费阶段:
- 同步消费:Consumer 在消费消息后,手动发送 CONSUME SUCCESS 响应,确保消息被正确消费;
- 异步消费 + 本地消息表:在异步消费场景下,通过本地消息表记录消息的消费状态,定时扫描未确认的消息并进行重试。某电商平台在“双11”期间,通过同步发送 +同步刷盘 + 同步复制 + 本地消息表的组合,成功实现了消息的0丢失
二、RocketMQ 如何保证消息的顺序性?
概念:
- 局部有序:MQ来保证,单个队列内消息天然有序,跨队列无法保证顺序;
生产端:并行改串行
- 使用单一生产者,避免在集群部署下,因为网络抖动影响消息的前后到达顺序;
- 使用分布式锁,即使在集群下,也能保证消息的顺序;
消息队列:局部有序
- 用一种业务消息放在同一个队列中,保证局部有序;
消费端:多线程的场景下可以会打乱消息顺序
- 对单个队列的消息进行串行处理(避免多线程并发消费导致顺序错乱),关键字:MessageListenerOrderly;
三、RocketMQ 如何解决消息积压?
1 消费者性能优化
2 增加消费者:转发分流 + 并行消费
- 原消费组不再处理业务逻辑,转为 “转发者”—— 从原队列读取积压消息,按规则转发到新增的多个队列;
- 为每个新增队列分配独立的新消费组;
- 通过新增队列数量,和对应消费组的实例扩容,大幅提高消息处理的并行能力,加速积压消化;
四、如何解决消息的重复消费?
所有的 MQ 并没有提供主动解决消息重复的机制,需要由消费者自行控制。
原因:
- 生产者第一次发生失败,后续重试时, 导致 Broker 有重复消息;
- 消费者确认消费时,发生异常;
解决:
- 业务上做幂等处理,通过自己生成一个消息唯一标识,消费时先校验该 ID 是否已处理;不要使用 RocketMQ 自带的 MessageID,集群部署或高并发下容易重复;
五、

浙公网安备 33010602011771号