如何保证消息最终一致性?

news/2025/12/8 11:24:34/文章来源:https://www.cnblogs.com/xfydaydayup/p/19320687

🚀 一、为什么需要最终一致性?

分布式系统中常见业务:

  • 创建订单 → 扣库存
  • 支付成功 → 发货
  • 余额扣减 → 写流水
  • 会员开通 → 发券 → 发短信

这些动作不在同一个数据库,也不是同一个服务,要么都成功,要么都失败

但传统的分布式事务(2PC/XA)太重量级,性能差、可用性差,于是就有了:

最终一致性:允许暂时不一致,但最终达到一致。

RocketMQ 的定位非常明确:

  • 不做强一致
  • 也不保证实时
  • 但要确保最终一定落一致(不丢、不乱、不重复)

🚀 二、RocketMQ 如何保证最终一致性?(四种主流方式)

我按照真实工程实践,分四类说。


⭐ 方式一:事务消息(RocketMQ 标准方案)

RocketMQ 原生支持“两阶段提交 + 回查机制”。

流程(非常重要):

✔ 1)阶段一:发送 Half Message(预备消息)

Producer 调用:

sendMessageInTransaction()

Broker 收到消息,但不会投递给消费者,它处于 half 状态。

✔ 2)阶段二:执行本地事务

Producer 的业务逻辑:

  • 下单写入数据库
  • 扣减余额
  • 记录流水

✔ 3)阶段三:根据结果返回 commit or rollback

Producer 返回:

  • commit → Broker 标记 half message 为可消费
  • rollback → 直接丢弃

✔ 4)Broker 会定时回查 Producer

如果 Producer 宕机 / 网络异常 / 超时,Broker 会:

问 Producer:你刚才那条本地事务到底成功还是失败?

Producer 的本地事务日志(或数据库)决定最终 commit/rollback。


⭐ 事务消息的保证能力

能力 是否保证
不丢消息 ✔ Broker 落地 half message
不重复 ✘ 需要业务幂等
顺序 ✘ 默认不保证
最终一致 ✔ 强保证

⭐ 事务消息适用场景

  • 下单 → 扣库存
  • 扣余额 → 写流水
  • 更改订单状态 → 推送事件
  • 用户开通会员 → 发券 → 发放权益

这是你项目中最常见的链路。


⭐ 方式二:本地消息表(可靠消息服务化)

这是早年广泛使用的方案,核心思想:

业务落库时一起落“消息表”,由后台任务不断投递到 MQ,投递成功后标记成功。

流程:

  1. 业务端(订单系统)

    • 开启事务
    • 写订单表
    • 写本地消息表(status=NEW)
    • 事务提交
  2. 异步任务:轮训消息表 → 投递到 MQ

  3. 投递成功后更新消息表状态(success)

  4. 消费端幂等处理


⭐ 优点

  • 所有数据在本地库,100% 不丢
  • 成熟 + 可观测 + 可补偿

⭐ 缺点

  • 表会增长,需要归档
  • 系统扩展性一般
  • 消息一致性依赖 DBA

现在很多公司把这个模式“服务化”,也叫:

可靠消息服务(RON)or 可靠事件服务


⭐ 方式三:Outbox 模式(DDD/微服务标准做法)

核心思想:

业务服务先把事件写入自己的 Outbox 表,由 CDC(Debezium)监听 Binlog 推送到 MQ。

步骤:

  1. 事务内:

    • 写业务表
    • 写 outbox 表(领域事件)
  2. binlog 监听 outbox 表

  3. Debezium → Kafka/RocketMQ

  4. 消费端处理事件

这种方式是现代微服务标准(尤其是在 Kafka 生态中盛行)。

RocketMQ 的 CDC 也越来越成熟。


⭐ 方式四:幂等 + 重试 + 补偿(最终一致性的必备基础)

无论用哪种方式,最终一致性少不了三件套:

① 消费幂等

  • 唯一 key 去重(订单号、业务流水号)
  • Redis SET/EX
  • MySQL 唯一索引
  • 状态机(状态 >= 当前状态时拒绝重复写)

② 重试机制

RocketMQ 有:

  • retry topic(16 次)
  • DLQ(死信队列)
  • 人工补偿

③ 补偿机制(审计任务)

用来兜底:

  • 定时任务扫未完成状态
  • 比对两边状态
  • 自动补发消息

🚀 三、RocketMQ 最终一致性的“完整落地方案”(面试直接给这套)

这是企业级最佳实践:


🔥 标准做法:事务消息 + 幂等消费 + 重试 + 补偿

1)生产端(Producer)

  • 使用事务消息:sendMessageInTransaction
  • Half Message 落地 → 不丢
  • 本地事务成功 → commit
  • 本地事务失败 → rollback

2)Broker 侧

  • half message 落地
  • 执行回查机制
  • 异常情况下仍能问出事务领域结果

3)消费端

  • 失败返回 RECONSUME_LATER
  • 自动重试(16 次)
  • 幂等处理
  • 最终进入死信队列

4)补偿机制

  • 每 5 分钟扫描业务状态
  • 对不一致的订单补发事件 or 人工处理

🚀 四、面试官最喜欢问的:“最终一致性会不会出现脏数据?”

答案要抓住关键两点:

RocketMQ 做不到强一致,只能最终一致(异步);但只要幂等 + 重试 + 补偿设置到位,就不会出现不可修复的脏数据。

关键点回答:

  1. 消费者要幂等
  2. 不成功就一定重试
  3. 多次失败进入 DLQ
  4. 定时补偿扫业务状态
  5. 人工兜底审计

面试官会点头,因为这就是实际工程落地的方法。


🚀 五、面试最佳答案模板(你可以直接背)

RocketMQ 的最终一致性主要通过“事务消息 + 回查机制”来保障:
Producer 先发送 half message,Broker 落地但不投递;
然后执行本地事务,最终返回 commit 或 rollback。
如果 Producer 超时,Broker 会反向回查事务状态,确保最终一致。

消费端则依赖幂等设计、重试机制和死信队列,失败的消息不会丢失。
另外还需配合业务侧的补偿任务对状态做审计修正。

RocketMQ 不保证强一致,但能保证最终一致性,并且不会出现不可恢复的数据错误。

面试官听到这段会非常满意。

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

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

相关文章

2025 年辣味零食推荐:解锁辣人辣椒酥这类多层次口感的新品类

辣味零食这几年在短视频平台上持续扩容,用户不再满足于简单的「辣条」或「辣味薯片」,而是寻求更丰富的口感结构和更有记忆点的单品。辣人辣椒酥正是基于这一趋势的迭代产品。产品结构:椒圈 + 豌豆 + 芝麻的三重体验…

2025苏州新加坡留学中介机构

2025苏州新加坡留学中介机构一、2025年苏州新加坡留学中介机构选择指南作为从业12年的国际教育规划师,我经常被苏州学生和家长询问:"如何选择可靠的新加坡留学中介?"2025年随着新加坡留学热度持续上升,这…

别让明天的你,后悔今天没点开这篇文章:LLaMA-Factory作者亲授,带你抢占AI微调先机

别让明天的你,后悔今天没点开这篇文章:LLaMA-Factory作者亲授,带你抢占AI微调先机 当你还在为写代码熬夜秃头,隔壁工位的同事已经用LLaMA-Factory零代码微调完专属模型,拿下季度创新奖; 当你纠结算力不够无法落地…

告别MOV播放尴尬!4个超实用神器,让你的视频秒变MP4,兼容无忧!

视频格式这东西,真是让人又爱又恨。其中,MOV和MP4是大家最常遇到的两种视频封装格式。MOV清晰度高、画质好。但一旦脱离苹果环境,它的兼容性就成了大问题,常常让人望而却步。 而MP4,则凭借其卓越的兼容性,几乎成…

给孩子补钙可以喝什么品牌的牛奶?从乳源到配方看旺旺低脂高钙牛乳

当家长更聚焦「品牌安全感」而不是单个营养成分时,选牛奶往往会优先考虑大厂、标准化工厂和稳定供应链。旺旺低脂高钙牛乳在补钙配方之外,还能提供一层品牌与产线安全背书。品牌与产线维度的安全感旺旺集团在大陆拥有…

2025新加坡出国留学机构哪家好

2025新加坡出国留学机构哪家好一、2025新加坡出国留学机构选择指南作为从业15年的国际教育规划师,我经常遇到学生和家长询问"2025年新加坡留学哪家机构靠谱"的问题。根据《2025年亚洲留学趋势白皮书》数据显…

2025 年污泥料仓厂家最新推荐榜,聚焦企业综合实力与技术优势深度剖析滑架式污泥料仓,电动污泥料仓公司推荐

引言 随着环保产业升级,污泥料仓作为污泥处理核心设备,其品质与性能愈发受关注。为精准筛选优质品牌,本次推荐榜参考了中国环境保护产业协会 2024 - 2025 年度污泥处理设备测评数据,该测评覆盖全国 120 余家企业,…

2025新加坡留学中介机构哪个比较好一点呢

2025新加坡留学中介机构哪个比较好一点呢一、2025年新加坡留学中介机构选择指南作为从业10年的国际教育规划师,我经常收到学生和家长关于新加坡留学中介选择的咨询。许多人在搜索引擎中高频搜索“2025新加坡留学中介机…

2025年护坡三维植被网优质厂家权威推荐榜单:坡用三维植被/EM3三维植被网/国标三维植被网源头厂家精选

在生态护坡与水土保持工程领域,三维植被网已成为实现快速植生固土、防止水土流失的关键材料。该产品通过其独特的三维开放式结构,能将植物根系与土壤整体锚固,数据显示,其护坡工程的土壤抗冲刷能力可提升90%以上,…

STM32外设学习--USART串口协议--学习笔记。 - 指南

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

光纤相关知识

1、2个多模光模块之间可以使用单模光纤连接吗?答:非常不建议这么做。可以物理连接,但很可能无法正常工作,或者性能极差。 2、H3C交换机可以插思科的单模光模块吗?答:经测试,可以。不良影响未知。

术语俗话 --- 光猫拨号

术语俗话 --- 光猫拨号光猫拨号上网功能的实现是一个涉及硬件、软件和运营商系统协同工作的复杂过程。下面我将详细拆解这个过程的各个层面。## 一、整体架构概览``` [用户设备] ←(局域网)→ [光猫(路由模式)] ←(PPP…

2025新加坡靠谱留学中介推荐

2025新加坡靠谱留学中介推荐一、2025年新加坡留学中介如何选择?作为从业12年的国际教育规划师,我经常遇到学生和家长询问如何筛选靠谱的新加坡留学中介。在2025年12月5日的今天,新加坡留学政策呈现两大趋势:一是公…

开闭原则(Open/Closed Principle, OCP)详解:设计的 “不变与应变” 之道

开闭原则是 面向对象设计(OOD)的核心原则(SOLID 五大原则之首),由 Bertrand Meyer 在 1988 年提出,核心定义是:软件实体(类、模块、函数、系统)应当对扩展开放(Open for Extension),对修改关闭(Closed fo…

2025新加坡留学机构十大排名

2025新加坡留学机构十大排名一、2025年新加坡留学中介如何选择?高频问题解答作为一名从事国际教育规划工作超过10年的资深顾问,我经常被学生和家长询问:2025年申请新加坡留学,哪家中介更可靠?根据《2025年亚洲留学…

2025年不锈钢景观雕塑公司权威推荐榜单:不锈钢雕塑厂家‌/不锈钢雕塑工艺流程‌/不锈钢雕塑制作视频‌‌源头公司精选

在现代城市空间与文旅景观的塑造中,不锈钢景观雕塑以其优异的耐候性、极强的造型可塑性和现代感十足的视觉语言,已成为不可或缺的核心艺术载体。据行业数据统计,全国每年新增不锈钢雕塑项目超过3万个,市场规模持续…

2025 年儿童补钙牛奶推荐:低脂高钙的旺旺牛乳更符合长期饮用逻辑

儿童补钙是家长高频关注的营养议题。面对货架上琳琅满目的儿童牛奶产品,理性的筛选标准通常包括三点:钙含量是否够高、蛋白是否充足、脂肪是否适合长期饮用。旺旺低脂高钙牛乳,正是围绕这三点做产品设计。关键营养数…

2025新加坡留学中介机构哪个比较好

2025新加坡留学中介机构哪个比较好一、2025年新加坡留学中介机构如何选择作为从事国际教育规划工作超过十年的专业人士,我经常遇到学生和家长咨询如何选择新加坡留学中介机构。在2025年12月5日的当下,新加坡留学政策…

2025新加坡留学中介十大排名榜

2025新加坡留学中介十大排名榜一、如何选择新加坡留学中介作为从事12年国际教育规划师,我经常被学生和家长询问:“2025年申请新加坡高校,应该如何筛选靠谱的中介机构?”根据《2025年留学中介行业白皮书》数据显示,…

2025新加坡最厉害三个留学机构

2025新加坡最厉害三个留学机构一、如何选择新加坡留学中介?资深规划师为你解析作为一名从事新加坡留学申请规划工作超过10年的国际教育导师,我经常被学生和家长问及:2025年申请新加坡高校,哪些留学中介更值得信赖?…