利用MQ事务消息实现分布式事务

news2024/11/16 7:22:01

MQ事务消息使用场景

消息队列中的“事务”,主要解决的是消息生产者和消息消费者的数据一致性问题。
拿我们熟悉的电商来举个例子。一般来说,用户在电商 APP 上购物时,先把商品加到购物车里,然后几件商品一起下单,最后支付,完成购物流程,就可以愉快地等待收货了。
这个过程中有一个需要用到消息队列的步骤,订单系统创建订单后,发消息给购物车系统,将已下单的商品从购物车中删除。因为从购物车删除已下单商品这个步骤,并不是用户下单支付这个主要流程中必需的步骤,使用消息队列来异步清理购物车是更加合理的设计。

在这里插入图片描述

对于订单系统来说,它创建订单的过程中实际上执行了 2 个步骤的操作:
1 在订单库中插入一条订单数据,创建订单;
2 发消息给消息队列,消息的内容就是刚刚创建的订单。

购物车系统订阅相应的主题,接收订单创建的消息,然后清理购物车,在购物车中删除订单中的商品。

在分布式系统中,上面提到的这些步骤,任何一个步骤都有可能失败,如果不做任何处理,那就有可能出现订单数据与购物车数据不一致的情况,比如说:
创建了订单,没有清理购物车;
订单没创建成功,购物车里面的商品却被清掉了。

那我们需要解决的问题可以总结为:在上述任意步骤都有可能失败的情况下,还要保证订单库和购物车库这两个库的数据一致性。

对于购物车系统收到订单创建成功消息清理购物车这个操作来说,失败的处理比较简单,只要成功执行购物车清理后再提交消费确认即可,如果失败,由于没有提交消费确认,消息队列会自动重试。

问题的关键点集中在订单系统,创建订单和发送消息这两个步骤要么都操作成功,要么都操作失败,不允许一个成功而另一个失败的情况出现。
这就是事务需要解决的问题。

消息队列是如何实现分布式事务的?

事务消息需要消息队列提供相应的功能才能实现,Kafka 和 RocketMQ 都提供了事务相关功能。

回到订单和购物车这个例子。

在这里插入图片描述
首先,订单系统在消息队列上开启一个事务。然后订单系统给消息服务器发送一个“半消息”,这个半消息不是说消息内容不完整,它包含的内容就是完整的消息内容,半消息和普通消息的唯一区别是,在事务提交之前,对于消费者来说,这个消息是不可见的。

半消息发送成功后,订单系统就可以执行本地事务了,在订单库中创建一条订单记录,并提交订单库的数据库事务。然后根据本地事务的执行结果决定提交或者回滚事务消息。如果订单创建成功,那就提交事务消息,购物车系统就可以消费到这条消息继续后续的流程。如果订单创建失败,那就回滚事务消息,购物车系统就不会收到这条消息。这样就基本实现了“要么都成功,要么都失败”的一致性要求。

这个实现过程中,有一个问题是没有解决的。如果在第四步提交事务消息时失败了怎么办?对于这个问题,Kafka 和 RocketMQ 给出了 2 种不同的解决方案。

Kafka 的解决方案比较简单粗暴,直接抛出异常,让用户自行处理。我们可以在业务代码中反复重试提交,直到提交成功,或者删除之前创建的订单进行补偿。RocketMQ 则给出了另外一种解决方案

RocketMQ 中的分布式事务实现

在 RocketMQ 中的事务实现中,增加了事务反查的机制来解决事务消息提交失败的问题。如果Producer 也就是订单系统,在提交或者回滚事务消息时发生网络异常,RocketMQ的 Broker 没有收到提交或者回滚的请求,Broker 会定期去 Producer 上反查这个事务对应的本地事务的状态,然后根据反查结果决定提交或者回滚这个事务。

为了支撑这个事务反查机制,我们的业务代码需要实现一个反查本地事务状态的接口,告知RocketMQ 本地事务是成功还是失败。

在我们这个例子中,反查本地事务的逻辑也很简单,我们只要根据消息中的订单 ID,在订单库中查询这个订单是否存在即可,如果订单存在则返回成功,否则返回失败。
RocketMQ 会自动根据事务反查的结果提交或者回滚事务消息。

这个反查本地事务的实现,并不依赖消息的发送方,也就是订单服务的某个实例节点上的任何数据。这种情况下,即使是发送事务消息的那个订单服务节点宕机了,RocketMQ 依然可以通过其他订单服务的节点来执行反查,确保事务的完整性。
综合上面讲的通用事务消息的实现和 RocketMQ 的事务反查机制,使用 RocketMQ 事务消息功能实现分布式事务的流程如下图:
在这里插入图片描述

很多人常有问题:为什么不等待订单创建成功再向消息队列发送订单数据呢?这样也不用考虑订单创建失败而发送消息的情况了。

如果先创建订单,当前服务由于不可抗拒因素不能正常工作了,没有给购物车系统发送消息,这种情况加就会出现订单已经创建并且购物车没有清空的情况。
如果是发送半消息这种情况,可以通过定期查询事务的状态然后根据然后具体的业务回滚操作或者重
新发送消息,保证数据的最终一致性。

代码实现和底层代码原理:RocketMQ源码分析 9.3 9.4 9.5

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

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

相关文章

为游客提供完美旅程:携程集团携手亚马逊云科技联合创新

刚刚过去的“五一”假期,旅游行业展现出了强劲的复苏势头。经文化和旅游部数据中心测算,全国国内旅游出游合计2.74亿人次,同比增长70.83%。 然而,出行前的航班高铁订票、酒店商旅预订、出游行程安排,就已经让不少家庭为…

C++linux高并发服务器项目实践 day9

Clinux高并发服务器项目实践 day9 信号集信号集相关函数以下信号集相关的函数都是对自定义的信号集进行操作sighandler_t函数sigaction函数 SIGCHLD信号共享内存共享内存使用步骤共享内存操作函数 信号集 许多信号相关的系统调用都需要能表示一组不同的信号,多个信…

深度思考:在 AI 时代,你会被放大一千倍的能力是什么?

Datawhale干货 作者:艾芙,复旦大学,百姓AI教育负责人 前言 大家晚上好,我是艾芙,百姓 AI 的 AI 教育负责人。 先做一下自我介绍,我是一个在技术圈和教育圈反复横跳的斜杠中年了。大约在 5 年前&#xff0c…

C++格式输入输出

🐶博主主页:ᰔᩚ. 一怀明月ꦿ ❤️‍🔥专栏系列:线性代数,C初学者入门训练,题解C,C的使用文章,「初学」C,数据结构 🔥座右铭:“不要等到什么都没…

常用的数据中心部署架构

说起数据中心,相信大家并不陌生。随着互联网行业的蓬勃发展,大数据时代的快速到来,数据中心同我们的生活紧密联系,息息相关。我们日常生活中的各种数据几乎都存储在数据中心里,例如:手机照片的云端备份、放…

Python小姿势 - # Python相关技术知识点

Python相关技术知识点 标题 在Python中如何处理文件 如果你要处理文件,那么在Python中你需要使用到os模块中的一些方法。 首先,你需要使用os.path.exists方法来判断文件是否存在: python if os.path.exists(file.txt): print(文件存在) else:…

asp.net企业员工考勤管理系统

企业员工管理系统主要是为企业内部管理员工使用的,主要功能分为员工和管理员两部分,主要的功能有用户登录,管理员信息管理,公告信息管理,文件审批管理,员工信息管理,工资信息管理,奖…

全景丨0基础学习VR全景制作,平台篇第19章:热点功能-文本

大家好,欢迎观看蛙色VR官方——后台使用系列课程! 功能说明 应用场景 热点,指在全景作品中添加各种类型图标的按钮,引导用户通过按钮产生更多的交互,增加用户的多元化体验。 文本热点,即点击热点后会弹出…

一顿饭的事儿,搞懂了Linux5种IO模型

大家好,我是老三,人生有三大难题,事业、爱情,和 ——这顿吃什么! 人在家中躺,肚子饿得响,又到了不得不吃的时候,这顿饭该怎么吃?吃什么呢? Linux里有五种I…

【笔记】【HTTP】《图解HTTP》第1章 了解Web及网络基础

前言 有输入就要有产出,该笔记是本人看完《图解HTTP》后对每章涉及到的知识进行汇总博客将会已书的每章为一篇发布,下一篇博客发布时间不确定笔记中有些个人理解后整理的笔记,可能有所偏差,也恳请读者帮忙指出,谢谢。…

在Notion AI 中轻松打造您的AI私人助理,提供卓越的工作体验

大家好,我是瓜叔。 相信平时喜欢做笔记的人对notion 选应该不陌生近年来越来越多人开始把notion 选当做他们的主力笔记软件。 我自己也用了约4年的时间。如果你也是notion的爱好者但还不知道notion AI是什么。那这篇文章,我会分享我是如何实际操作使用技…

Windows terminal+wsl+ohmyzsh+powerlevel10k打造更美丽的终端

安装wsl 安装 WSL 和 Linux 的默认 Ubuntu 发行版。 了解详细信息https://learn.microsoft.com/zh-cn/windows/wsl/install。 还可以使用此命令通过运行 wsl --install 来安装其他 Linux 发行版。 若要获取发行版名称的有效列表,请运行 wsl --list --online。 wsl -…

AIOps探索 | 新形势下,中小银行如何学好数字化转型“必修课”?

一、强化数智驱动 推进转型升级 2023年4月21日,在江苏省支付清算服务协会、山东省支付清算协会的大力支持下,由金科创新社(鑫知)主办的“2023农村中小银行数字化转型研讨会”在江苏南京成功举办。 ​本次大会以“强化数智驱动 推…

深入浅出堆—C语言版【数据结构】

二叉树概念博客:http://t.csdn.cn/XIW84 目录 1. 了解堆 1.1 堆的概念 1.2 堆的性质: 1.3 堆的结构图片 1.3.1 小堆 1.3.2 大堆 2. 堆的实现 2.1 插入数据进堆 2.2 向上调整函数 2.3 堆的删除 2.4 向下调整 3. 堆的应用 3.1 建堆&#xff…

赚钱单页产品

今天写一篇文章,讲一个最近看的赚钱单页产品。 先下定义,什么是赚钱的单页产品: 能赚钱:需求切的准单页产品:通常只有少数几个页面就完成了产品的核心功能,一个程序员可以在1天左右,完成开发 先…

快速理解基本的cookie、session 和 redis

一、Cookie 1、什么是Cookie 1、Cookie实际上是一小段的文本信息,是一种keyvalue形式的字符串。客户端请求服务器,如果服务器需要记录该用户状态,就使用response向客户端浏览器颁发一个Cookie。客户端会把Cookie保存起来。 2、当浏览器再请求…

跨境电商系统开发需要注意的问题

跨境商城系统开发需要考虑许多特殊问题,比如涉及跨国支付、物流、法律和政策、文化差异等等。下面将列出一些重要的问题,来帮助您更有效地开发跨境电商系统。 1、税务问题 当涉及跨国交易时,涉及不同国家和地区的税收政策和税率。特别是在国…

2023亚马逊云科技中国峰会开启报名 6月27-28日上海见

2023年6月27-28日,2023亚马逊云科技中国峰会,亚马逊云科技将聚焦构建新技术加速的产品创新、新架构提升的业务弹性、云计算引领的创新模式,围绕价值加速实现,企业敏捷稳健,行业全新机遇等热门话题,携手众多…

( 位运算 ) 136. 只出现一次的数字 ——【Leetcode每日一题】

❓136. 只出现一次的数字 难度:简单 给你一个 非空 整数数组 nums ,除了某个元素只出现一次以外,其余每个元素均出现两次。找出那个只出现了一次的元素。 你必须设计并实现线性时间复杂度的算法来解决此问题,且该算法只使用常量…

学习dtw-python库内容 动态弯曲距离(DTW)具体实现

文章目录 一、install 数据包二、函数功能三、函数的参数以及含义四、具体实现 一、install 数据包 简单的pip install一下就好了,注意最后提示Successfully installed dtw-python-1.3.0 pip install dtw-python二、函数功能 执行 DTW 算法,并计算两个…