RocketMQ怎么保证消息不丢失
目录一、生产端消息能可靠到达 Broker二、Broker 端消息落盘 多副本硬件故障也不丢1. 同步刷盘SYNC_FLUSH2. 主从同步复制SYNC_MASTER3. 存储结构顺序写 持久化三、消费端消费成功才确认失败可重试四、全链路配置建议零丢失方案五、一句话总结RocketMQ 保证消息不丢失核心是生产端可靠发送 Broker 持久化与高可用 消费端可靠消费的全链路设计。下面分段讲清楚原理与关键配置。一、生产端消息能可靠到达 Broker同步发送 等待 ACK用send()同步发送Broker 成功写入并持久化后才返回SEND_OK。禁止用OneWay单向发送无确认核心业务必须用同步 / 异步带回调发送。自动重试 业务兜底客户端默认重试 2 次可自定义重试次数与间隔。重试失败时本地日志 / 数据库记录 定时重试避免消息丢失RocketMQ。事务消息解决生产者本地事务与发送原子性流程发送 Half 消息 → 执行本地事务 → 成功则 Commit失败则 Rollback。Broker 长时间未收到指令会回查生产者事务状态防止悬挂。二、Broker 端消息落盘 多副本硬件故障也不丢1. 同步刷盘SYNC_FLUSH消息写入CommitLog后立即刷入磁盘才返回 ACK。配置flushDiskTypeSYNC_FLUSH默认异步刷盘 ASYNC_FLUSH断电会丢内存数据。适用金融 / 支付等零丢失场景。2. 主从同步复制SYNC_MASTER主 Broker 写入成功后同步复制到从 Broker从节点确认后主节点才返回 ACK。配置brokerRoleSYNC_MASTER默认异步 ASYNC_MASTER主宕机可能丢未复制数据。高可用主宕机从自动切换为主数据不丢。3. 存储结构顺序写 持久化消息 append 到 CommitLog顺序写盘性能高且不易损坏。配合主从集群 同步刷盘可抵御单机断电、磁盘损坏等故障。三、消费端消费成功才确认失败可重试先消费后 ACKAt Least OnceConsumer 拉取消息→执行业务逻辑→成功后返回CONSUME_SUCCESS失败返回RECONSUME_LATER。Broker 收到成功 ACK 才删除消息否则重试投递。Offset 持久化消费位点Offset定期持久化默认 5 秒也可手动提交避免重启后重复消费或漏消费。重试队列 死信队列DLQ消费失败→进入重试队列延迟重试默认最多 16 次。超过最大重试次数→进入死信队列人工排查补偿防止消息丢失。消费幂等必做重试会导致消息重复业务需实现幂等性如唯一键约束、状态机保证 “至少一次” 转为 “精确一次”。四、全链路配置建议零丢失方案环节配置 / 实践生产端同步发送、3-5 次重试、失败落地本地库、事务消息Broker同步刷盘SYNC_FLUSH、同步主从SYNC_MASTER消费端手动提交 ACK、业务成功后才返回成功、消费幂等、死信监控五、一句话总结RocketMQ 不丢消息靠生产端同步发送 重试 事务、Broker 同步刷盘 同步主从、消费端先业务后 ACK 重试 幂等全链路闭环保障。