RocketMQ 通过多层次的机制设计,在 生产者发送、Broker 存储 和 消费者消费 三个阶段确保消息不丢失,以下是具体实现和配置策略:
一、生产者发送阶段
-
同步发送 + 确认机制
- 使用同步发送(
sendSync
)并等待 Broker 返回写入结果,确保消息成功持久化。 - 示例代码:
SendResult sendResult = producer.send(msg); if (sendResult.getSendStatus() == SendStatus.SEND_OK) { // 消息发送成功 }
- 使用同步发送(
-
事务消息机制
- 适用于分布式事务场景,通过两阶段提交(2PC)保证业务操作与消息发送的原子性。
- 执行流程:
- 发送半事务消息(
prepare
状态)。 - 执行本地事务并提交。
- Broker 通过回调确认事务状态(Commit/Rollback)。
- 发送半事务消息(
-
重试机制
- 生产者内置自动重试(默认重试 2 次),可配置重试次数:
producer.setRetryTimesWhenSendFailed(3); // 同步发送重试次数 producer.setRetryTimesWhenSendAsyncFailed(3); // 异步发送重试次数
- 生产者内置自动重试(默认重试 2 次),可配置重试次数:
二、Broker 存储阶段
-
消息持久化机制
- 刷盘策略:
策略 可靠性 性能 适用场景 同步刷盘 高 低 金融、交易等强一致性场景 异步刷盘 中 高 日志、监控等高吞吐场景 - 配置方式(Broker 配置文件
broker.conf
):flushDiskType = SYNC_FLUSH # 同步刷盘 # flushDiskType = ASYNC_FLUSH # 异步刷盘
- 刷盘策略:
-
主从复制(HA)
- 复制模式:
模式 数据可靠性 性能 延迟 同步复制 高 中 主从均写入成功返回 异步复制 中 高 主写入成功即返回 - 配置方式(Broker 角色):
brokerRole = SYNC_MASTER # 同步复制 # brokerRole = ASYNC_MASTER # 异步复制
- 复制模式:
-
集群部署与故障转移
- 采用多副本(Dledger 模式),基于 Raft 协议实现自动选主和数据同步。
- 配置示例:
enableDLegerCommitLog = true dLegerGroup = RaftGroup dLegerPeers = node1:40911;node2:40912;node3:40913
三、消费者消费阶段
-
消费确认机制(ACK)
- 消费者需显式返回
CONSUME_SUCCESS
确认消息处理完成,否则 Broker 会重新投递。 - 示例代码(PushConsumer):
consumer.registerMessageListener((MessageListenerConcurrently) (msgs, context) -> { // 处理消息 return ConsumeConcurrentlyStatus.CONSUME_SUCCESS; // 确认消费成功 });
- 消费者需显式返回
-
重试与死信队列
- 消息消费失败时进入重试队列(默认重试 16 次),最终失败则转入死信队列(%DLQ% 前缀)。
- 重试次数配置:
consumer.setMaxReconsumeTimes(5); // 最大重试次数
-
幂等性设计
- 消费者需通过唯一标识(如消息 ID 或业务键)实现幂等性,避免重复消费导致数据异常。
- 示例方案:
if (redis.exists(msg.getMsgId())) { return ConsumeConcurrentlyStatus.CONSUME_SUCCESS; // 已处理过 } processMessage(msg); redis.set(msg.getMsgId(), "processed");
四、运维与监控保障
-
磁盘健康监控
- 监控 Broker 节点的磁盘使用率和 I/O 性能,避免因磁盘故障导致数据丢失。
-
定期备份与恢复
- 使用
admin
工具备份 CommitLog 和 ConsumeQueue:sh mqadmin exportMsg -n localhost:9876 -t YourTopic -s "2023-01-01 00:00:00" -e "2023-01-02 00:00:00" -f /backup/msg.log
- 使用
-
告警机制
- 配置 Broker 写入失败、主从同步延迟等关键指标的告警。
五、可靠性权衡
配置项 | 高可靠性方案 | 性能影响 | 适用场景 |
---|---|---|---|
生产者发送 | 同步发送 + 事务消息 | 较高 | 金融交易、订单系统 |
Broker 刷盘 | 同步刷盘 + 同步复制 | 高 | 强一致性业务 |
消费者确认 | 严格 ACK + 死信队列监控 | 中 | 数据敏感型业务 |
通过以上机制的组合配置,RocketMQ 能够在 99.99% 的场景下保证消息不丢失,但需根据业务需求在可靠性和性能之间做出合理权衡。