如何保证 RocketMQ 消息不丢失

news/2025/12/7 22:48:11/文章来源:https://www.cnblogs.com/xfydaydayup/p/19319071

🚀 一句话总览:消息不丢 = 生产端不丢 + Broker 不丢 + 消费端不丢

你要牢牢记住:

任何 MQ 最容易丢的不是 Broker,而是 Producer 和 Consumer。

消息可靠性必须三段一起设计:

Producer(发送)  
Broker(存储)  
Consumer(消费)

我带你分段讲透。


🚀 一、Producer 如何保证消息不丢

Producer 端的丢消息风险其实最大,因为:

  • 网络问题
  • Producer 崩溃
  • 发送失败没有感知

要做到不丢,必须配置以下 5 点。


⭐1. 使用同步发送(send())而不是异步 / oneway

最关键的一点:

只有同步发送才能收到 Broker 的返回结果(SendResult)。

SendResult result = producer.send(message);

异步(sendAsync)可能回调没来就宕机,oneway 更是直接不保证成功。


⭐2. 开启发送失败重试

RocketMQ 默认发送失败重试 2 次,你应该显式配置:

producer.setRetryTimesWhenSendFailed(3);
producer.setRetryTimesWhenSendAsyncFailed(3);

当网络抖动、broker 瞬时负载高时非常关键。


⭐3. 打开“失败切换 Broker”机制(默认开启)

RocketMQ 默认如果一个 broker 不可用,会自动换另一台 broker 发送(failover)。

你不用额外配置,但你要知道这是原因之一。


⭐4. 避免“先提交本地事务、后发消息”(经典误区)

比如:

先写数据库成功  
再 send 消息 → send 失败  
业务不一致

正确做法:

用 RocketMQ 事务消息,两阶段提交。

RocketMQ 事务消息模型:

1)发送 half message
2)执行本地事务
3)commit 或 rollback
4)RocketMQ 回查未决事务

这样才不会丢。


⭐5. Producer 端做好消息持久化/重试机制(可选)

在更严格的企业系统里,会做:

  • 本地消息表
  • Redis 去重
  • 定时补偿任务

核心思想是:

发送前先存一份,发送失败时可以继续重试

这个属于高级玩法,但面试加分。


🚀 二、Broker 如何保证消息不丢(核心)

Broker 是最关键的一环。RocketMQ 不丢消息靠三件事:


⭐1. 使用同步刷盘(SYNC_FLUSH)

默认是异步刷盘:

异步刷盘 = 内存写成功就返回 Producer → 电源断了就丢。

要保证不丢,必须切换为同步刷盘:

SYNC_FLUSH

特点:

  • 写入 commitlog
  • 立即刷入磁盘
  • 返回 Producer

虽然牺牲一点性能,但可靠性最高。


⭐2. 使用同步复制(SYNC_MASTER)

主从复制有两种:

模式 会不会丢消息
ASYNC_MASTER 主节点挂了就可能丢
SYNC_MASTER 主从都写成功才 ack,几乎零丢失

必须用:

SYNC_MASTER

这也是大厂“核心链路”统一做法。


⭐3. 使用 DLedger(RocketMQ 5 推荐)

DLedger 是多副本一致性机制(类似 Raft)。

特点:

  • 多数派写成功才算成功
  • 自动选主
  • 零人工干预
  • 不丢数据

这比传统主从架构更安全。

面试时这样讲:

RocketMQ 5 使用 DLedger 多副本一致性存储,只要多数派节点写入成功,消息就不会丢失。

面试官会直接点头。


🚀 三、Consumer 如何保证消息不丢

消费者丢消息主要体现在:

  • 执行业务成功但是 offset 提交失败
  • 业务执行失败但 offset 提交成功
  • 自动提交 offset 导致漏消费

你按下面做就不会丢。


⭐1. 正确处理消费失败:必须返回 RECONSUME_LATER

PushConsumer:

return ConsumeConcurrentlyStatus.RECONSUME_LATER;

RocketMQ 会自动重试:

  • 1m
  • 5m
  • 10m
  • 最多 16 次
  • 失败进入 DLQ(死信队列)

这样单靠 RocketMQ 机制就能做到“不丢”。


⭐2. 业务处理成功后再提交 offset

不要提前提交 offset。

RocketMQ 默认是自动提交,但你要做到“处理完再 ack”。

PushConsumer 的 ack 机制是:

return CONSUME_SUCCESS 才会提交 offset。

你一定要保证:

业务 → 成功  
|  
ack

而不是:

ack  
|  
业务(失败的话消息就丢了)

⭐3. 保证幂等性(至少一次语义)

RocketMQ 是“至少一次”模型:

一条消息可能会投递多次,但绝不会不投递。

你必须使用幂等:

  • MySQL 唯一约束(推荐)
  • Redis setnx 去重
  • 消费幂等表
  • 分布式锁(不推荐)

幂等做对了,消息绝不会乱。


🚀 四、完整串联:从端到端实现“不丢消息”

你把这些组合起来就是终极方案。


🔥 Producer:

  • 同步发送
  • 失败重试
  • 消息落表/本地事务
  • 使用事务消息(强一致)

🔥 Broker:

  • SYNC_FLUSH
  • SYNC_MASTER
  • DLedger 多副本
  • = 2 副本架构

  • 优化 JVM + 磁盘配置

🔥 Consumer:

  • 失败返回 RECONSUME_LATER
  • 不自动 ack
  • 幂等性
  • 死信队列监控

🚀 五、面试版总结(你能一口气答完)

你可以这样总结:

RocketMQ 保证消息不丢主要从三个层面做的:

1)Producer:

  • 同步发送(send)
  • 重试机制
  • Failover 切换 broker
  • 事务消息避免“本地事务成功但消息发送失败”

2)Broker:

  • 同步刷盘 + 同步复制(SYNC_FLUSH + SYNC_MASTER)
  • DLedger 多副本一致性(多数派成功才算成功)
  • CommitLog 顺序写磁盘

3)Consumer:

  • 消费失败返回 RECONSUME_LATER
  • 业务成功后再提交 offset
  • 幂等机制(至少一次语义)

这三段组合起来,就能保证消息在任何节点都不会丢。

面试官会非常满意这样的回答。

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/991876.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

排列组合

排列组合 加法原理 完成某件事情有 \(n\) 类方法,其中第 \(i\) 类方法有 \(a_i\) 种方案。 则总共有 \(\sum_{i=1}^na_i\) 种方案。 乘法原理 完成某件事有 \(n\) 个步骤,第 \(i\) 个步骤有 \(a_i\) 种方案。 则共有…

2025 最新西双版纳旅游服务商TOP5推荐!地接社/旅行社五大优质品牌,资源实力 + 服务口碑权威榜单发布,专业赋能构筑美好旅行体验

随着西双版纳成为国内外游客向往的热带旅游目的地,市场对优质旅行社的需求持续攀升。本榜单基于资源整合力、服务专业度、产品创新力、客户口碑四大维度,结合行业协会数据与游客真实反馈,权威解析2025年五大西双版纳…

12.4 maven简介

maven仓库分类 本地仓库:自己计算机上的一个目录 中央仓库:maven团队维护的全球唯一的一个仓库 远程仓库:公司团队自己搭建的仓库 自己本地有jar就用;无就下过来; alt+insert能快捷导入jar包 groupid artifactId …

vs2026远程调试linux

vs2026远程调试linux网上都搜索不到有关教程,自己摸索了一下。 vs2026的安装步骤直接跳过,创建项目时选择cmake的项目在Linux系统中,如果是使用yum的包管理(比如centos),下载一些软件,远程调试需要使用 sudo yu…

深入理解 RocketMQ 核心机制

🚀 一、RocketMQ 核心机制 = “日志 + 顺序写 + 消费位点 + 多副本 + 动态路由” 一句话:RocketMQ 是一个高性能、可扩展、牢靠不丢消息的分布式消息系统,本质是一套“持久化日志 + 分布式调度”的组合拳。 要理解…

DMY 周作业 47 简要题解

G 数据结构优化 DP 板。暑假的时候做过,直接离散化 + BIT 就行了。比较无聊就不说了。 #include <bits/stdc++.h> #define fi first #define se second #define eb(x) emplace_back(x) #define pb(x) push_back…

2025最新西双版纳旅行社TOP5推荐!资源整合+服务升级权威榜单发布,品质赋能重构雨林旅游体验

随着西双版纳成为国内外游客向往的热带旅游目的地,优质旅行社的选择成为提升旅行体验的关键。本榜单基于资源掌控力、服务专业性、产品创新度三大维度(红土地文旅集团新增“品牌影响力”维度),结合行业协会数据与游…

豆包手机助手遭围剿,网友玩梗“微信OS”若成真,会长啥样?

一、豆包手机助手:横空出世即遇围剿 12 月的手机圈,被字节跳动的一款 AI 产品搅起了千层浪。12 月 1 日,豆包团队正式发布手机助手技术预览版,这款基于大模型能力与手机厂商操作系统级合作的工具,只用一句语音指令…

在Android中动态加载类

在Android中动态加载类在Android中动态加载类 较为复杂 编写Hello类 package main; public class Hello {public static void main(String[] args) {System.out.println("Hello World");}public String welc…

Flutter for HarmonyOS 创建指南(一):环境搭建与项目创建

pre { white-space: pre !important; word-wrap: normal !important; overflow-x: auto !important; display: block !important; font-family: "Consolas", "Monaco", "Courier New", …

2025最新西双版纳地接社TOP5评测!品牌实力+服务口碑权威榜单发布,专业赋能品质旅行体验

随着西双版纳成为国内外游客热门的旅游目的地,选择一家靠谱的地接社成为提升旅行体验的关键。本榜单基于综合实力、资源优势、服务口碑、定制能力四大维度,结合行业数据及游客反馈,权威解析2025年五大西双版纳地接社…

详细介绍:[特殊字符] 微前端部署实战:Nginx 配置 HTTPS 与 CORS 跨域解决方案(示例版)

pre { white-space: pre !important; word-wrap: normal !important; overflow-x: auto !important; display: block !important; font-family: "Consolas", "Monaco", "Courier New", …

Git预提交钩子实现代码美化自动化

本文介绍如何使用Git的pre-commit钩子结合astyle工具,在提交代码前自动美化代码格式,尤其适用于需要遵循特定编码规范(如Linux内核风格)的开发场景,提高代码质量和一致性。大家好。 在这篇文章中,我将分享我创建…

五、Java数组

本文系统讲解Java数组的核心概念与应用,涵盖数组声明创建、内存分析、多维数组、Arrays工具类及稀疏数组实现,适合Java初学者夯实基础,并为后续学习集合框架奠定坚实基础。1. 数组概述数组是相同数据类型的有序集合…

122_尚硅谷_init函数

122_尚硅谷_init函数1.init基本介绍 2.如果一个文件同时包含全局变量, init函数和main函数, 那么执行的顺序是:全局变量定义_init函数_main函数 3.utils包中有init会在main中导入后,先执行utils.go文件中的init

《安全测试指南》——会话管理测试【学习笔记】

【会话管理测试】*部分括号内容均为个人理解 。 1. 会话管理架构绕过测试(OTG-SESS-001)主要测试会话cookie是否不可预测。攻击模式:cookie搜集(搜集足够数量的cookie样本)cookie逆向工程(分析Cookie生成算法) …

氛围编程工具个人推荐

氛围编程工具个人推荐大模型推理能力(脑子) > 编辑器功能(手)。它更推崇拥有强大逻辑架构能力的模型(如Claude),而不是单纯的IDE集成工具。第一梯队 (First Echelon):主力军这一层级是作者认为完成“Vibe C…

Windows 11全面AI化:语音助手与自主代理技术解析

某中心对Windows 11进行大规模改造,引入了“Hey Copilot”语音唤醒、可分析屏幕内容的Copilot Vision以及能自主操控电脑完成任务的Copilot Actions等AI功能。这些技术构建了全新的人机交互模式,并涉及新的安全架构以…

20251207

明天试试自己独立完成老师布置的作业