当前位置: 首页 > 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。

相关文章:

  • Transfomer学习
  • idea中,git的cherry-pick怎么用
  • 【git】git commit模板
  • 流程自动化引擎:重塑企业数字神经回路
  • 当科技邂逅浪漫:在Codigger的世界里,遇见“爱”
  • 机器学习第十八讲:混淆矩阵 → 诊断模型在医疗检查中的误诊情况
  • 企业网站架构部署与优化-Nginx网站服务
  • 了解 DDD 吗?DDD 和 MVC 的区别是什么?
  • Android 蓝牙开发 - 蓝牙相关权限(蓝牙基本权限、Android 12 蓝牙新增权限、位置权限)
  • 测试工程师要如何开展单元测试
  • 通义灵码2.5智能体模式联合MCP:打造自动化菜品推荐平台,实现从需求到部署的全流程创新
  • t检验详解:原理、类型与应用指南
  • leetcode刷题日记——从前序与中序遍历序列构造二叉树
  • SOC-ESP32S3部分:2-2-VSCode进行编译烧录
  • Visual Studio Code 改成中文模式(汉化)
  • 【机器学习】logistic回归
  • 【C++算法】70.队列+宽搜_N 叉树的层序遍历
  • C++使用max_element()配合distance()求出vector中的最大值及其位置
  • Nvidia - NVLink Fusion
  • 代码随想录算法训练营
  • 斗鱼一季度直播收入降近三成,语音社交服务推高广告等收入,称将持续打击涉赌行为
  • 围绕加快科创中心建设,上海市委中心组学习会听取专题辅导报告
  • 建立双城双向科创项目孵化机制,2025沪港创新项目评选启动
  • 重庆一男大学生掉进化粪池死亡,重庆对外经贸学院:以学校通报为准
  • 无人机考证热背后:掏空年轻人钱包,养肥培训机构
  • 多名幼师殴打女童被行拘后续,盘锦教育局工作人员:该局将专项整治全市幼儿园