Loading [MathJax]/jax/output/CommonHTML/config.js
前往小程序,Get更优阅读体验!
立即前往
首页
学习
活动
专区
圈层
工具
发布
首页
学习
活动
专区
圈层
工具
MCP广场
社区首页 >专栏 >大数据开发:消息队列如何实现分布式事务?

大数据开发:消息队列如何实现分布式事务?

作者头像
成都加米谷大数据
修改于 2021-07-12 10:04:54
修改于 2021-07-12 10:04:54
7930
举报
文章被收录于专栏:大数据开发大数据开发

大数据技术生态当中,消息队列,主要是针对实时消息流的处理,而实时消息流场景下,常常需要解决的一个问题,就是数据一致性的问题,这其中又涉及到分布式事务。今天的大数据开发学习分享,我们就来讲讲消息队列如何利用事务消息实现分布式事务?

消息队列中的事务主要解决的是消息生产者和消息消费者的数据一致性问题。

拿电商来举个例子,一般来说,用户在电商APP上购物时,先把商品加到购物车里,然后几件商品一起下单,最后支付,完成购物流程,就可以等待收货了。这个过程中有一个需要用到消息队列的步骤,订单系统创建订单后,发消息给购物车系统,将已下单的商品从购物车中删除。因为从购物车删除已下单商品这个步骤,并不是用户下单支付这个主要流程中必需的步骤,使用消息队里来异步清理购物车是更加合理的设计图片对于订单系统来说,它创建订单的过程中实际上执行了2个步骤的操作:

在订单库中插入一条订单数据,创建订单。

发消息给消息队列,消息的内容就是刚刚创建的订单。

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

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

1、什么是分布式事务?

事务的4个特性(ACID):

原子性:指一个事务操作不可分割,要么成功,要么失败,不能有一半成功一半失败的情况。

一致性:指这些数据在事务执行完成这个时间点之前,读到的一定是更新前的数据,之后读到的一定是更新后的数据,不应该存在一个时刻,让用户读到更新过程中的数据。

隔离性:指一个事务的执行不能被其他事务干扰。即一个事务内部的操作及使用的数据对正在进行的其他事务是隔离的,并发执行的各个事务之间不能互相干扰。

持久性:指一个事务一旦完成提交,后续的其他操作和故障都不会对事务的结果产生任何影响。

事务消息适用的场景主要是那些需要异步更新数据,并且对数据实时性要求不太高的场景。

比如订单系统的例子,在创建订单后,如果出现短暂的几秒,购物车里的商品没有及时情况,也不是完全不可接受的,只要最终购物车的数据和订单数据保持一致就可以了。

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

回到订单和购物车这个例子,首先,订单系统在消息队列上开启了一个事务。然后订单系统给消息服务器发送一个半消息,这个半消息包含的内容是完整的消息内容,和普通消息的唯一区别是,在事务提交之前,对于消费者来说,这个消息是不可见的。

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

如果在第四步提交事务消息时失败了,Kafka会直接抛出异常,让用户自行处理,可以在业务代码中反复重试提交,直到提交成功,或者删除之前创建的订单进行补偿。

3、RocketMQ中的分布式事务实现

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

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

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

这个反查本地事务的实现,并不依赖消息的发送方,也就是订单服务的某个实例节点上的任何数据。这种情况下,即使是发送事务消息的那个订单服务节点宕机了,RocketMQ依然可以通过其他订单服务的节点来执行反查,确保事务的完整性。

关于大数据开发,消息队列如何实现分布式事务,以上就为大家做了基本的介绍了。消息队列在分布式事务方面,需要大家多去理解和深入,主流的解决方案,也要知晓。

本文系转载,前往查看

如有侵权,请联系 cloudcommunity@tencent.com 删除。

本文系转载,前往查看

如有侵权,请联系 cloudcommunity@tencent.com 删除。

评论
登录后参与评论
暂无评论
推荐阅读
编辑精选文章
换一批
如何利用事务消息实现分布式事务?
一说起事务,容易联想到数据库。我们日常使用事务的场景,绝大部分都是在操作数据库的时候。像 MySQL、Oracle这些主流的关系型数据库,也都提供了完整的事务实现。
王小明_HIT
2020/05/25
1.8K0
消息队列中:消息可靠性、重复消息、消息积压、利用消息实现分布式事务
可以利用消息队列的有序性来验证是否有消息丢失。在Producer端给每个发出的消息附加一个连续递增的序号,然后在Consumer端来检查这个序号的连续性。如果没有消息丢失,Consumer收到消息的序号必然是连续递增的,如果检测到序号不连续,那就是丢消息了。还可以通过缺失的序号来确定丢失的是哪条消息,方便进一步排查原因
搜云库技术团队
2019/11/21
2.2K0
消息队列中:消息可靠性、重复消息、消息积压、利用消息实现分布式事务
如何使用消息队列的事务消息
“发消息”过程,往往是为通知另外一个系统更新数据,MQ的“事务”,主要解决消息生产者和消息消费者的数据一致性问题。
JavaEdge
2021/02/22
2.3K0
如何使用消息队列的事务消息
消息队列(2)--如何利用事务消息实现分布式事务
事务消息适用的场景主要是那些需要异步更新数据,并且对数据实时性要求不太高的场景。比如我们在开始时提到的那个例子,在创建订单后,如果出现短暂的几秒,购物车里的商品没有被及时清空,也不是完全不可接受的,只要最终购物车的数据和订单数据保持一致就可以了。
小时的棒棒糖
2023/10/03
6560
消息队列(2)--如何利用事务消息实现分布式事务
Kafka技术知识总结之二——Kafka事务
Kafka 事务与数据库的事务定义基本类似,主要是一个原子性:多个操作要么全部成功,要么全部失败。Kafka 中的事务可以使应用程序将消费消息、生产消息、提交消费位移当作原子操作来处理。 为了实现事务,Producer 应用程序必须做到:
剑影啸清寒
2020/07/08
2.2K0
Kafka技术知识总结之二——Kafka事务
消息队列RocketMQ版分布式事务消息
消息队列RocketMQ版提供的分布式事务消息适用于所有对数据最终一致性有强需求的场景。本文介绍消息队列RocketMQ版事务消息的概念、优势、典型场景、交互流程、使用规则以及示例代码。
码农编程进阶笔记
2022/12/21
1.2K0
消息队列RocketMQ版分布式事务消息
事务消息的理解
事务消息是分布式系统中用于保证本地事务与消息发送原子性的特殊消息类型,其核心目标是解决生产者端的数据一致性问题。例如,在电商场景中,订单系统创建订单后需发送消息清理购物车,事务消息确保这两操作要么都成功,要么都失败,避免数据不一致(如订单已创建但购物车未清理)。
麦辣鸡腿堡
2025/03/18
1010
互联网电商大厂的分布式事务使用案例
事务的原子性、持久性可确保在一个事务内,更新多条数据都成功/失败。在一个系统内部,我们可以使用数据库事务来保证数据一致性。那如果一笔交易,涉及到跨多个系统、多个数据库的时候,用单一的数据库事务就没办法解决了。
JavaEdge
2022/12/15
9750
互联网电商大厂的分布式事务使用案例
「查缺补漏」巩固你的RocketMQ知识体系
Windows安装部署 下载 地址:[https://www.apache.org/dyn/closer.cgi?path=rocketmq/4.5.2/rocketmq-all-4.5.2-bin-
Kerwin
2020/08/26
4300
消息队列之事务消息,RocketMQ 和 Kafka 是如何做的?
今天我们来谈一谈消息队列的事务消息,一说起事务相信大家都不陌生,脑海里蹦出来的就是 ACID。
全栈程序员站长
2021/04/07
5150
揭开 RocketMQ 事务消息的神秘面纱
事务消息是 RocketMQ 的高级特性之一,相信很多同学都对于其实现机制很好奇。
勇哥java实战
2023/07/12
6701
消息队列的七种经典应用场景
在笔者心中,消息队列,缓存,分库分表是高并发解决方案三剑客。在职业生涯中,笔者曾经使用过 ActiveMQ 、RabbitMQ 、Kafka 、RocketMQ 这些知名的消息队列 。
勇哥java实战
2024/03/28
4050
细品分布式事务
我们平时的单机事物的使用,一步操作,要么全部执行完成,要么全部不执行,也就是ALL or Nothing。但是如果我们使用了分布式,一件事情分为多个分别在多个在不同的机器(进程)上执行。那对于这种的事物我们应该如何控制呢?
袁新栋-jeff.yuan
2021/02/04
4360
RocketMQ实践: RocketMQ的分布式事务消息的实现原理
以电商交易场景为例,用户支付订单这一核心操作的同时会涉及到下游物流发货、积分变更、购物车状态清空等多个子系统的变更。在微服务架构场景下,这些子系统之间要么是通过RPC通信,要么通过MQ消息组件通信。
崔认知
2023/06/20
1.6K0
RocketMQ实践: RocketMQ的分布式事务消息的实现原理
事物消息的实现-RocketMQ知识体系6
分布式事务是指事务的参与者、支持事务的服务器、资源服务器以及事务管理器分别位于不同的分布式系统的不同节点之上。例如在大型电商系统中,下单接口通常会扣减库存、减去优惠、生成订单 id, 而订单服务与库存、优惠、订单 id 都是不同的服务,下单接口的成功与否,不仅取决于本地的 db 操作,而且依赖第三方系统的结果,这时候分布式事务就保证这些操作要么全部成功,要么全部失败。本质上来说,分布式事务就是为了保证不同数据库的数据一致性。
DougWang
2021/07/29
4950
事物消息的实现-RocketMQ知识体系6
分布式事务及查询优化
前面我们简单了解了互联网电商中的 分布式订单管理系统的设计,这篇我们聊聊其中涉及到的分布式事务以及一些查询优化方案。
leon 橙
2023/11/14
3670
消息队列学习 | 基础
异步处理也可以理解为并发处理,即多个任务同时进行,不需要等待,与之相对的是串行处理,需要一步一步等待执行
素履coder
2022/02/17
7720
消息队列学习 | 基础
消息队列消息丢失和消息重复发送的处理策略
来源:https://www.jianshu.com/p/533fc6fc0963 分布式事务 什么是分布式事务 我们的服务器从单机发展到拥有多台机器的分布式系统,各个系统之前需要借助于网络进行通信,原有单机中相对可靠的方法调用以及进程间通信方式已经没有办法使用,同时网络环境也是不稳定的,造成了我们多个机器之间的数据同步问题,这就是典型的分布式事务问题。 在分布式事务中事务的参与者、支持事务的服务器、资源服务器以及事务管理器分别位于不同的分布式系统的不同节点之上。分布式事务就是要保证不同节点之间的数据一致性
程序猿DD
2022/07/04
2K0
消息队列消息丢失和消息重复发送的处理策略
分布式事务的解决方案
原子性(Atomicity )、一致性( Consistency )、隔离性或独立性( Isolation)和持久性(Durabilily),简称就是ACID
爱撸猫的杰
2021/02/05
3630
分布式事务的解决方案
消息队列杂谈
本篇文章聊聊消息队列相关的东西,内容局限于我们为什么要用消息队列,消息队列究竟解决了什么问题,消息队列的选型。
SH的全栈笔记
2022/08/17
3830
消息队列杂谈
相关推荐
如何利用事务消息实现分布式事务?
更多 >
领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档