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

【主力资金密码】副图指标升级版使用技术图文案例分解,通达信软件炒股指标公式代码

(1)主力资金线在低位时,对应的副图指标显示柱线是绿色,这个阶段主力资金参与小,行情处于下跌趋势或弱势震荡。当然,如果结合主图指标【翻倍密码系统】操作,主图的两个买卖点以及K线均线变色跟踪功能,更多的技术支撑,多空更加清晰,共振做多或多头更加确定和安全。如上图标记,中档虚线是参考安全操作的一个区间划分,粉色阶段做多或持股为主,为操作增加一道安全保护。如上图,副图指标【主力资金密码】更新叠加操作区间背景,绿色阶段持币或做空,粉色阶段做多或持股。如上图,副图指标,标记的两个区间,绿色区间时做空或持币。

weixin_69760830的博客 2552

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

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

qq_37756660的博客 1295

告别电源纹波!手把手教你用UCC28019设计一个高效率PFC模块(附完整原理图与BOM清单)

本文详细介绍了如何使用UCC28019设计高效率PFC模块,解决电源纹波问题。通过优化补偿网络、关键元器件选型及PCB布局,实现功率因数提升至0.99以上,降低输入电流谐波。附完整原理图与BOM清单,适用于电赛等快速开发场景。

weixin_42652674的博客 334

将AAL图谱对应到Yeo7大网络中【原理,代码分析】

本文介绍了将AAL2图谱映射到Yeo7大功能网络的方法。通过整合皮层(Yeo2011)、小脑(Buckner2011)和纹状体(Choi2012)三个区域的功能网络图谱,采用投票机制确定每个AAL区域的网络归属。具体步骤包括:1)统计每个AAL区域体素在各网络图谱中的分布;2)选择体素数量最多的网络作为该区域的最终标签。该方法实现了从解剖结构到功能网络的映射,可获得120个AAL区域对应的7大功能网络标签。

yes666666的博客 2204

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

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

A1L__的博客 521

Oracle 11g RAC 节点通信故障排查与修复指南

本文详细介绍了Oracle 11g RAC集群发生节点通信故障时的系统性排查与修复方法。当出现节点异常重启时,核心问题往往源于心跳网络中断。文章提供了从快速诊断、日志分析到六层深度检查的完整指南,并给出了针对网络配置、内核参数及Oracle已知Bug等常见根因的实战解决方案,帮助DBA快速恢复集群稳定。

weixin_29246195的博客 270

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

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

a327919006的专栏 571

Cadence IC618/Spectre231安装避坑指南:详解环境变量配置与License管理那些事儿

本文深入解析Cadence IC618/Spectre231安装过程中的环境变量配置与License管理难题,提供从变量冲突解决到高效License管理的实用方案。针对常见的64位标识冲突、路径污染及License服务器连接问题,给出具体诊断步骤和优化建议,帮助用户构建稳定可靠的EDA环境。

weixin_33737134的博客 615

速腾聚创多激光雷达点云采集,并用RVIZ进行显示

在ubuntu20.04系统下,使用速腾聚创官方提供的软件RSView,对激光雷达的默认IP地址、MSOP 包端口号、 DIFOP包端口号和时间模式等配置进行查看和修改。使用交换机对两个激光雷达进行组网,实现多激光雷达数据采集,并用RVIZ同时显示两个雷达点云。使用wireshark对比两个雷达数据包。

abanchao的博客 5888

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

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

lx9876lx的博客 950

C#上位机与VisionPro通用框架:视觉标定、通信联动与现场排坑实战

工业自动化设备的上位机开发,往往面临流程控制、视觉检测、通信交互等环节的重复搭建。C#作为主流工业语言,配合VisionPro视觉软件,可通过通用框架设计将状态机调度、相机采集、标定算法与串口/扫码枪通信等底层能力模块化,从而大幅降低项目交付成本。其核心原理在于:将设备工艺差异封装至配置层,视觉流程通过CogToolBlock工具链与VPP模板复用,九点标定建立像素与机械坐标系的映射关系。该方案已在螺丝锁付、点胶定位等多类产线落地,尤其适用于批量交付、换型频繁的视觉设备场景。这套从实践中沉淀的框架思路,以及

weixin_31102231的博客 335

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

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

sinat_24477937的博客 769

2026年7月19日 从可插拔到共封装:技术路线研究报告

AI 算力的爆发正在重写数据中心光互连的技术路线。本报告对当前并存的四代光互连架构——

weixin_51184047的博客 584

ssm框架搭建

这个是一个在idea上成功跑起来的ssm框架项目,保存在这里方便以后使用直接下载

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

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

qq_21486655的博客 442

大中型超市收银系统(可直接运行)

光步前台收银系统系统功能:商品销售、商品退货、挂单、收银员权限、会员销售、单品取消、整单取消、商品查询、脱机销售、脱机数据上传,基本资料下载,开钱箱、小票打印、收款结算,支持多币种付款方式(现金、储值卡、礼券、微信等),支持多种促销。运行环境:.net 4.0登陆信息用户名:1001 密码:123456内置商品信息,商品编码可输入00001000 - 00010000,测试效果相关功能键F5 结算 F9挂单 F11商品查询 F8退货 Insert单品取消 Del整单取消 F12开钱箱F2 会员 Ctrl+Z退出系统 Home 锁屏 相关源码待公开

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的相关信息太少,这次做完也不敢藏私共享出来,还望大家指正

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

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

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、付费专栏及课程。

余额充值