场景——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,集群部署或高并发下容易重复;

 

五、

 

posted @ 2025-08-11 16:58  幻月hah  阅读(7)  评论(0)    收藏  举报