04 | 利用事务消息实现分布式事务

分布式事务在点赞功能中的实现 author:excerpt:Tortoise-ORM提供基础事务和装饰器事务两种管理方式,确保数据一致性。跨服务事务处理使用Saga模式,按反向顺序执行补偿操作确保最终一致性。常见报错包括事务超时、唯一约束冲突和请求参数校验失败,需优化事务操作、使用upsert和详细响应模型解决。扫描。 阅读详情

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

以电商为例,用户在电商APP上购物,加商品到购物车,再几件商品一起下单,支付。

这个过程中,订单系统会通过消息队列发订单消息给购物车模块,其消费订单消息从购物车中移除下单商品。

因为购物车删商品不是下单必须流程的缘故,因此会有上述的异步删购物车数据的操作。

订单系统 ===== 创建 ====> 订单库

                ====发送订单创建消息 ==> 消息队列 ====> 购物车系统 ==清除购物车==> 购物车库

对于订单系统来说,它创建订单的过程实际上执行了2个步骤的操作:

1. 订单库创建数据

2. 发送订单创建消息

对于购物车系统,对订阅的主题,接收消息后只有一个操作就是移除购物车订单上的商品记录。

分布式系统中,任何步骤的失败,如果不做处理,会出现系统间数据不一致。

1. 比如插入了新商品订单,没有删除购物车商品记录。

2. 没有新增商品订单,购物车商品记录被删除了。

待解决问题可归纳为:上述任意步骤都可能失败时,保证订单库和购物车库这两个库的数据一致性。

对于购物车系统删除购物车商品记录失败的话,可以不回复确认,消息队列服务端会重发,成功处理后回复确认即可。

对于订单系统,插商品订单记录操作和发消息两个步骤一致成功和一致失败的保证则较为困难,也是事务需要解决的问题。

什么是分布式事务?

较为浅显的说明:对若干数据进行更新操作,希望若干操作要么都成功,要么都失败。

严格定义:ACID。

A:若干操作要么都成功,要么都失败

C:若干操作完成前的时间点,读到的是完成前的数据状态,完成后则是完成后的数据状态,不存在中间状态被读到。

I:各事务内部操作的数据对其他事务是隔离的,即并发事务操作的共同数据是互相隔离的。

D:一个事务一旦完成提交,后续其他故障或操作不影响本事务的结果。(???)

大部分传统单体RDBM都完整实现了ACID。对于分布式系统,严格实现ACID几乎不可能,或者说因为代价过大导致无法接受。

分布式事务就是要在分布式系统中实现事务。在保证高可用、高性能下,光一致性就较为困难,因此有很多“残血版”:最终一致性,顺序一致性。(????)

目前所说分布式事务,都是在分布式系统中事务的不完整实现:在不同应用场景中,有不同的实现,目的是通过一些妥协来解决实际问题。(????)

比如在实际应用中,有2PC(???)、TCC(???)、事务消息。每一种实现都有其特定的使用场景和各自的问题,没有银弹。

事务消息适合的场景为需要异步更新数据,并对数据实时性要求不高的场景。即只要求达到一个最终一致性,并对达到的时延要求不高,比如购物车内的商品删除延迟个几秒都没有关系,只要最终订单数据与购物车商品数据一致即可。

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

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

        

       ===========3. 执行本地事务,创建订单==========> 订单库

订单系统  == 1. 开启事务 ==>

                == 2. 发送半消息 ==>  消息队列 ==5. 投递消息==> 购物车系统

                == 4. 提交或回滚 ==>

半消息和普通消息的唯一区别是在消息投递前,对于消费者来说,半消息不可见。

上述过程,第4步的操作与第3步本地事务的提交与回滚操作保持一致。

上述过程存在一个问题,在于第4步的操作可能发生失败。Kafka处理失败直接抛异常由使用方重试提交直到成功,或者删除第3步的订单进行补偿。RocketMQ给出了另一种方案。

RocketMQ中的分布式事务实现

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

由业务代码实现反查本地事务状态的接口,提供给RMQ告知本地事务成功与否。

前述订单系统为例,Broker通过半消息中的订单ID去调用接口,查订单库是否存在该订单。

挂了任意的订单节点,只要还有存活的节点都不影响反查,也就是开启事务去发半消息的节点挂了也无所谓。

综合前述通用事务消息的实现和RocketMQ的事务反查机制,使用RocketMQ实现分布式事务的流程

 

小结

我们通过一个订单购物车的例子,学习了事务的ACID,和使用消息队列实现分布式事务的方案。

几种现有的分布式事务的解决方案,包括事务消息,但是这几种方案都不能解决分布式系统中所有问题,每个方案都有适用场景和局限性。

最后一起学习了RocketMQ中事务反查机制,以此补偿事务消息的提交或回滚时的通信失败。在Kafka的事务功能中,并没有类似的反查机制,需要用户自行去解决这个问题。

SpringCloud Alibaba微服务实战三十二 - 集成RocketMQ实现分布式事务 分布式事务是在微服务开发中经常会遇到的一个问题,之前的文章中我们已经实现了利用Seata来实现强一致性事务,其实还有一种广为人知的方案就是利用消息队列来实现分布式事务,保证数据的最终一致性,也就是我们常说的柔性事务。 阅读详情

相关推荐

消息队列-利用事务消息实现分布式事务

“发消息”过程,往往是为通知另外一个系统更新数据,MQ的“事务”,主要解决消息生产者和消息消费者的数据一致性问题。用户在电商APP上购物时先把商品加到购物车然后几件商品一起下单最后支付完成购物流程,就可以愉快地等待收货该过程中有个需用MQ。订单系统创建订单后,发消息给购物车模块,将已下单商品从购物车删除。从购物车删除已下单商品步骤,并非用户下单支付这个主要流程的必需步骤,所以使用MQ异步清理购物车更合理。订单模块创建订单的过程实际执行了俩操作:在订单DB插一条订单数据,用来创建订单发消息给MQ,消息内容即刚创建的订单购物车模块订阅相应主题,接收订单创建的消息,然后清理购物车,在购物车中删除订单

rabbitmq 遇到的问题集合

下面是几个问题: 1.为什么要进行消息确认? 2.rabbitmq消息确认 机制是什么样的? 3.发送方如何确认消息发送成功?什么样才算发送成功? 4.消费方如何告知rabbitmq消息消费成功或失败? 5.使用spring的代码示例 1.为什么要进行消息确认? 经常会听到丢消息的字眼, 对于前面的demo来说,就存在丢消息的隐患. 发送者没法确认是否发送成功,消费者处理失败也无法反馈. 没有消息确认机制,就会出现消息莫名其妙的没了,也不知道什么情况. 2.rabbitmq消..

lw670020705的专栏 1261

从Oracle到腾讯TDSQL数据库升级技术分享

腾讯TDSQL(Tencent Distributed SQL)是一款兼具关系数据库和NoSQL数据库优点的新型数据库,文章主要分享oracle升级为TDSQl数据库技术经验。

u012372850的专栏 2613

04 | 如何利用事务消息实现分布式事务?

那什么是事务呢?如果我们需要对若干数据进行更新操作,为了保证这些数据的完整性和一致性,我们希望这些更新操作要么都成功,要么都失败。至于更新的数据,不只局限于数据库中的数据,可以是磁盘上的一个文件,也可以是远端的一个服务,或者以其他形式存储的数据。这就是通常我们理解的事务。其实这段对事务的描述不是太准确也不完整,但是,它更易于理解,大体上也是正确的。所以我还是倾向于这样来讲“事务”这个比较抽象的概念。一个严格意义的事务实现,应该具有 4 个属性:原子性、一致性、隔离性、持久性。

qq_37756660的博客 1295

避坑指南:中国地面气候日值数据集(V3.0)处理中的常见错误与解决方案

本文详细解析了中国地面气候日值数据集(V3.0)处理中的常见错误与解决方案,包括数据清洗、特征值解码、时间序列处理和质量控制等关键步骤。通过Python实战代码示例,帮助研究者高效处理这一包含全国699个气象站多要素日值数据的数据集,避免常见陷阱,提升气候变化研究和农业气象分析的准确性。

xray4的博客 1026

安卓逆向实战:利用Frida-RPC自动化获取大麦演唱会数据

本文详细介绍了如何利用Frida-RPC技术实现安卓逆向自动化,以获取大麦演唱会数据。通过实战演示,从环境搭建、使用Frida动态分析定位核心签名算法,到封装为可复用的Python脚本,完整解析了自动化数据获取的技术路径与工程化思考。

cheese的博客 974

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

​ 之前提到的事务ACID大部分传统的单体关系型数据库(Mysql Oracle)都完整的实现了 ACID,但是,对于分布式系统来说,严格的实现 ACID 这四个特性几乎是不可能的,或者说实现的代价太大,大到我们无法接受。​ 分布式事务就是要在分布式系统中的实现事务。在分布式系统中,在保证可用性和不严重牺牲性能的前提下,光是要实现数据的一致性就已经非常困难了,所以出现了很多“残血版”的一致性,比如顺序一致性、最终一致性等等。

A1L__的博客 521

使用autodl服务器运行CasMVSNet以及使用colmap产生的数据

MVSNet学习

qq_44708206的博客 3274

cn-rmq 基于可靠消息的分布式事务框架

文章目录介绍中文文档源码地址:RMQ对接示例:框架定位流程说明正常流程消息发送阶段异常流程消息消费阶段异常流程架构图节点角色说明 介绍 RMQ(reliable-message-queue)是基于可靠消息的最终一致性的分布式事务解决方案。 中文文档 中文文档地址:https://www.showdoc.cc/rmq 源码地址: https://gitee.com/NuLiing/reliab...

a327919006的专栏 571

HFSS实战项目——Ku波段微带发夹线滤波器

保姆级教程!!!看完必会,非常详细!!!Ku频段5阶切比雪夫微带线带通滤波器的仿真实例。首先介绍了滤波器的技术指标和基本理论知识,重点介绍了滤波器的耦合系数和外部品质因数。建立了谐振器的设计模型、耦合系数与谐振器间距的设计模型、外部品质因数与抽头位置的设计模型和滤波器整体电路的模型。详细介绍了谐振器设计模型的建立步骤。

2401_87464239的博客 3040

61、神经科学中的分岔与双分子反应研究

本文探讨了神经科学中的分岔现象与双分子反应建模。在神经元网络中,通过分析四细胞网络的呼吸节律振荡,揭示了分岔对振荡频率和占空比的影响,并区分了单神经元与网络层面的分岔特性。在神经群体模型中,系统参数变化引发的分岔可导致振荡、混沌等动态行为转变,文中详细介绍了局部分岔、全局分岔和高余维分岔的机制,并以Jansen-Rit模型为例展示了输入水平变化下的分岔过程。在分子层面,重点介绍了MWC模型在描述配体与多位点蛋白质结合中的应用,涵盖其构象状态、平衡常数及统计因子。研究表明,分岔理论和双分子反应建模为理解神经系

yog99的博客 80

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

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

lx9876lx的博客 950

YOLOv8改进,YOLOv8添加可变性卷积DCNv2

DCNv2对原始的DCNv1进行了改进,可变形卷积网络的卓越性能源于其适应对象几何变化的能力。通过对其自适应行为的检查,虽然对其神经特征的空间支持比常规的ConvNets更接近于对象结构,但这种支持可能远远超出感兴趣区域,导致特征受到不相关图像内容的影响。为了解决这个问题,我们提出了一种可变形卷积网的重新表述,通过提高建模能力和更强的训练,提高了其专注于相关图像区域的能力。通过更全面地集成网络中的可变形卷积,并引入扩展变形建模范围的调制机制,增强了建模能力。

在职AI算法工程师,擅长计算机视觉,YOLO目标检测、分割等,擅长web、pyqt界面可视化,好内容持续更新中,来这里跟大家一起学习,共同进步 3606

04如何利用事务消息实现分布式事务

那什么是事务呢?如果我们需要对若干数据进行更新操作,为了保证这些数据的完整性和一致性,我们希望这些更新操作要么都成功,要么都失败。至于更新的数据,不只局限于数据库中的数据,可以是磁盘上的一个文件,也可以是远端的一个服务,或者以其他形式存储的数据。这就是通常我们理解的事务。其实这段对事务的描述不是太准确也不完整,但是,它更易于理解,大体上也是正确的。所以我还是倾向于这样来讲“事务”这个比较抽象的概念。原子性、一致性、隔离性、持久性。这四个属性通常称为 ACID 特性。原子性。

sinat_24477937的博客 769

迈瑞BS系列全自动生化分析仪LIS协议接口手册(内含HL7和ASTM)

迈瑞BS系列全自动生化分析仪LIS协议接口手册,内含HL7和ASTM)

消息队列_04(如何利用事务消息实现分布式事务)

如何利用事务消息实现分布式事务 消息队列中的事务,主要解决的是消息生产者和消费者的数据的一致性问题 举例:下订单的中删除购物车中的商品 分布式事务介绍 事务: 要么都成功,要么都失败 不仅限于数据,可以是文件,远端服务,其他形式存储的数据 原子性:一个事务不可分割,要么成功,要么失败 一致性:更新完成后读到的数据是更新前或者更新后的数据,不是更新过程的数据 隔离性:一个事务的执行不能被其他事务干扰...

qq_21486655的博客 442

Outlook Express 6 (OE6) for Win7/Win8/Win10

英文版 Outlook Express6.0, 兼容Win7/Win10/WinXP,解压就可用。

rabbitmq-04 rabbitmq解决分布式事务

1.RabbitMQ消息重试机制 消费者在消费消息的时候,如果消费者业务逻辑出现程序异常,这时候应该如何处理? 答案:使用消息重试机制。(springboot默认有消息重试机制) 1.1 如何合适选择重试机制 消费者获取到消息后,调用第三方接口,但接口暂时无法访问,是否需要重试? (需要重试机制) 消费者获取到消息后,抛出数据转换异常,是否需要重试?(不需要重试机制)需要发布进行解决。 ...

沐宇熙IT成长之路 1万+

C# WinForm 基于DirectShow.dll编写的程序,可边预览边保存视频,音频和图片

基于微软的DirectShow.dll的二次开发1.自动识别连接的摄像头跟麦克风且可以对其进行选择(默认选中第一个)2.可录制wmv和avi两种格式的视频并且都带有音频,avi可以录制的分辨率和帧数进行选择,wmv默认进行了淸晰度优化如不喜欢可去除代码中有相关提示3.可在预览点开之后进行拍照,也可边录制视频边拍照4.添加了视频和音频的压缩功能(酌情使用)这次二次开发发现C#对DirectShow的相关信息太少,这次做完也不敢藏私共享出来,还望大家指正

efm32 入门.pdf

本PDF共计22页,介绍的是操作驱动API,下载与否自己斟酌。

基于本地消息表实现分布式事务(最终一致性)

传统单体架构下,所有的功能模块都在一个应用下,所有的代码和业务逻辑都在同一个应用下实现,所以保证数据的一致性就很简单,保证相关操作都在同一个本地事务下就可以了。但是在微服务架构下,将一个应用拆分成了多个独立的服务,每个服务都能有自己的数据库,服务间通信都是通过远程调用实现,实现一个功能可能需要由几个不同的服务来共同实现。这就会带来一个问题,不同的服务之间无法做到使用同一个事务,这就无法保证数据的一致性了。

2373

图解RocketMQ之如何实现事务消息

我们先想象一个场景:从用户 A 的账户中扣减 100 元。向用户 B 的账户中增加 100 元。这两个步骤要么都成功,要么都失败。如果在步骤 1 扣减了100元,但步骤 2 增加时发生了错误,我们希望,用户A的账户金额恢复到原来的状态。上面是一个典型的事务场景,什么是事务?,简而言之,事务是逻辑上的一组操作,要么都执行,要么都不执行。下面有一道经典的八股,衡量事务的四大特性的了解程度,理解的背一下就好了。

一个成长中的程序员,期待用技术的眼光生活 1737

分布式事务原理【理论篇】

例如,用户信息和订单信息分别在两个 MySQL实例存储,用户管理系统删除用户信息,需要分别删除用户信息及用户的订单信息,由于数据分布在不同的数据实例,需要通过不同的数据库链接去操作数据,此时产生分布式事务。在计算机系统中,更多的是通过计算机控制事务,这是利用数据库本身的事务特性来实现的,因此叫数据库事务,由于应用主要靠关系型数据库来控制事务,而数据库通常和应用在同一个服务器,所以基于关系型数据库的事务又被称为本地事务。【3】即使从服务器还没有实时同步,从数据库也要返回查询结果,即使是旧数据也需要返回。

程序猿进阶 1315

分布式事务-本地消息表学习与落地方案

分布式事务本地消息表核心原理的学习,提供一些落地方案

蒋大钊的博客 1150

分布式事务系列04--分布式事务的解决方案--4种方案

https://blog.youkuaiyun.com/u010425776/article/details/79516298 https://blog.youkuaiyun.com/kobejayandy/article/details/54783212 https://blog.youkuaiyun.com/liaomin416100569/article/details/78908196 https://www.cnbl...

NRGAGA的专栏 2049

分布式事务之RocketMQ实现消息最终一致性

目录引言开发流程开发步骤伪代码流程图 引言 开发流程 开发步骤 客户下单 生成预订单 调用产品服务扣减库存 调用客户服务扣减余额 2、3、4步骤正常执行完,修改订单状态为正式订单 3、4步骤出现异常时推送MQ 回退扣减产品库存(幂等处理) 回退扣减客户余额(幂等处理) 伪代码 public class OrderController { @RequestMapping("/saveOrder") public R saveOrder(@RequestBody Order order) {

。。。 1392
上一篇: 消息模型: 主题和队列有什么区别
下一篇: 05 | 如何保证消息不丢失
vectorX
博客等级 码龄11年 37粉丝 21原创
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

个

红包个数最小为10个

元

红包金额最低5元

当前余额3.43元 前往充值 >
需支付:10.00元
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付元
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值