当前位置: 首页 > news >正文

RocketMQ 的事务消息是如何实现的

为什么要用事务消息?​​

想象一个场景:你在电商平台下单支付,需要同时完成两个操作:

  • ​​操作1​​:扣减库存(数据库事务)
  • ​​操作2​​:通知物流系统发货(发消息)

如果两个操作不同步完成,可能出现:

  • 库存扣了但物流没收到通知(用户付了钱但没发货)
  • 物流收到通知但库存没扣(超卖)
  • 事务消息就是为了解决这种跨服务的“要么全成功,要么全失败”问题。

​​2. 核心流程(两阶段提交)​​

​​阶段一:发半消息(试探)​​

​​1、生产者​​发送一条​​半消息​​到RocketMQ(Broker)。

  • 这条消息会被临时存到特殊主题RMQ_SYS_TRANS_HALF_TOPIC,​​消费者看不到它​​。
  • 相当于对Broker说:“我先发个草稿,你别告诉别人,等我确认后再公开。”

2、​​Broker​​回复ACK:“草稿收到了,你继续。”

​​3、生产者​​收到ACK后,​​执行本地事务​​(比如扣减库存)。

  • 如果本地事务成功:记录“可以公开消息”。
  • 如果失败:记录“消息作废”。


​​阶段二:确认提交或回滚​​

​​4、生产者​​根据本地事务结果,告诉Broker:

  • ​​Commit​​:“草稿可以公开了!” → Broker将消息转移到真实Topic,消费者可见。
  • ​​Rollback​​:“草稿作废!” → Broker删除半消息。

5、​​容错机制(回查)​​:

  • 如果生产者宕机,没来得及告诉Broker结果怎么办?
  • ​​Broker会主动回查​​:每隔1分钟扫描半消息,找到“未确认”的消息,问生产者:“这消息到底要不要公开?”
  • 生产者需实现checkLocalTransaction方法,检查本地事务状态并回复Broker。
http://www.xdnf.cn/news/557875.html

相关文章:

  • 【Java高阶面经:微服务篇】3.熔断机制深度优化:从抖动治理到微服务高可用架构实战
  • unipp === 状态管理 Pinia 使用
  • 萌新联赛第(三)场
  • 自建主机NAS
  • Java转Go日记(四十二):错误处理
  • 链表-设计链表
  • OBS Studio:windows免费开源的直播与录屏软件
  • Tractor S--二维转一维,然后最小生成树
  • Python 中 pass 语句的详解和使用
  • Java双指针法:原地移除数组元素
  • IEEE出版|2025年智能光子学与应用技术国际学术会议(IPAT2025)
  • CRC计算
  • doris数据分片逻辑
  • RFID技术在半导体晶圆卡塞盒中的应用方案
  • C语言学习笔记之结构体
  • Cribl 在的function 的活用 (pipeline中)
  • day018-磁盘管理-案例
  • PySide6 GUI 学习笔记——常用类及控件使用方法(常用控件调色板QPalette)
  • Linux X86平台安装ARM64交叉编译器方法
  • 如何在 AOSP 中判断一个源文件属于哪个模块(以 CameraService 为例)
  • 首次中医知识问答模型微调
  • CSS display有几种属性值
  • 深入理解 Python 中的几种方法:实例方法、类方法、静态方法与特殊方法
  • leetcode 162. Find Peak Element
  • python新手学习笔记①
  • Linux探秘:驾驭开源,解锁高效能——基础指令
  • Git命令使用全攻略:从创建分支到合并的完整流程
  • 大模型高效微调技术全面解析:从PEFT原理到实战应用
  • 项目进度延误,如何按时交付?
  • 预训练模型:深度学习的通用特征引擎