四种基于MQ的分布式事务解决方案

基于MQ的分布式事务实现方案 在与不同业务系统之间进行交互时,怎么保证发送的消息对方一定能收到,可能有人说RocketMQ就能做到,如果贵公司用到的消息队列是kafka、rabbitmq、activemq怎么保证不丢?这里分享一下基于消息的分布式事务解决方案,此种方案是最终一致性的解决方案,不挑MQ,但是前提MQ本身要支持接收到的消息不能丢失。... 阅读详情

在微服务的时代,分布式事务是绕不开的话题,尽管在大多数场景下,我们并不需要使用分布式事务,但是 不需要使用 不代表 可以不会使用,万一哪天真需要用到了呢?分布式事务是一个比较大的话题,今天我们来看看基于MQ的分布式事务解决方案。

在实际开发中,为了简化分布式事务,我们和其他服务交互,经常会采用MQ的方式,我们先来看下如果采用MQ的方式和其他服务进行交互,应该怎么做。

采用MQ的方式和其他服务进行交互

基于RocketMQ 事务消息+最大努力通知

RocketMQ提供了事务的消息的功能,我们来看下事务消息的原理:

  1. Producer发送一个半消息到Broker;
  2. Broker收到半消息后,响应Producer,Broker会将半消息存储到一个特殊的Topic,此时Consumer是不能消费此消息的;
  3. Producer执行本地事务;
  4. Producer根据本地事务的执行情况,告知Broker Commit或者Rollback,如果Commit,Broker会将消息投递到正常的Topic,此时Consumer可以正常消费此消息。

如果因为某种原因,Broker未收到Producer的Commit或者Rollback,Broker会发起回查,Producer收到回查请求后,根据本地事务状态,重新响应Broker Commit或者Rollback。

对于Producer而言,本地事务和发送消息是一致的,要么都成功,要么都失败,但是无法保证Consumer的一致性,有不少人称之为“单端事务”,但是RocketMQ还为Consumer提供了重试的功能,只要Consumer不返回消息消费成功,Consumer还有16次机会可以重新消费此消息,执行自身的业务操作,相当于最大努力通知。

这个方案可以说是最常用的分布式事务解决方案了,不管是实现,还是原理都比较简单,但是仔细想想此方案还是有缺点的:

  1. 和RocketMQ强绑定,因为只有RocketMQ才提供了完善的事务消息的功能;
  2. 降低了可用性,如果Producer发送半消息失败,流程就终止了;
  3. 代码侵入性强,Producer需要提供执行本地事务、回调两个方法。

基于本地消息表

此方案在RocketMQ事务消息推出之前,是采用较多的一个分布式事务解决方案,需要在库中新建一张本地消息表,此表有如下核心字段:

  • topic:消息需要发送到哪个topic;
  • state:消息状态,有三种状态:1.未发送 2.发送失败 3.发送成功;
  • retry_num:重试次数;
  • time:消息产生的时间;
  • last_retry_time:最近重试时间;
  • message:消息内容。

作为Producer来说,原本是执行完本地业务后,直接将消息投递到MQ,现在需要将消息保存至本地消息表,然后由定时任务读取本地消息表,将需要推送的消息投递到MQ,具体做法如下:

  1. 本地业务+插入本地消息表 组成一个大的本地事务,以此保证两者的原子性、一致性,本地业务+插入本地消息表两个操作要么同时成功,要么同时失败;
  2. 新增定时任务,不断的扫描本地消息表,将未成功投递的消息进行投递,投递成功,修改本地消息表的状态字段,投递失败,修改本地消息表中的状态,并且重试次数+1,等待下一次重新投递。

这个方案实现也非常简单,缺点也显而易见:

  1. 严重依赖Job;
  2. 及时性比较差,如果Job每10分钟运行一次,那可能就有10分钟的延迟。如果Job每5分钟运行一次,那可能就有5分钟的延迟。
  3. 不断的扫描本地消息表,对数据库也是一种压力;
  4. 需要定期清理本地消息表。

基于内存队列+本地消息表

本地消息表这个方案还是不错的,有没有办法改善它的缺点呢?当然有,这个方案就是对传统的本地消息表方案进行了改造,据说部分二三线互联网公司就是采用的此种方案,具体看图(如果图片看不清,可以将图片下载到本地 或者 在新标签页中查看图片):

虽然此方案需要自己编码实现,但是整体来说,编码难度不大。

不管是基于RocketMQ事务消息的分布式事务解决方案,还是基于本地消息表的分布式事务解决方案,还是基于内存队列+本地消息表的分布式事务解决方案,都有消息表的概念,只是消息表的具体存在形式不同,一个是以数据表的形式存在(存在了数据库),一个是以Topic的形式存在(存在了Broker)。

以上三种方案都有一个局限性:和其他服务进行交互,必须比较采用MQ的方式。

不采用MQ的方式和其他服务进行交互

基于RocketMQ的延迟消息检查方案

上述三个方案,都有一个局限性:和其他服务进行交互,必须采用MQ的方式,如果不满足这个条件,如何采用MQ的方式来实现分布式事务呢:采用基于RocketMQ的延迟消息检查方案。

  1. Producer发送延迟消息;
  2. 其他服务需要提供检查接口,重试或者回滚接口;
  3. Producer收到延迟消息后,检查自身的业务操作是否执行成功,根据具体情况,判断是否需要重试或回滚,然后调用其他服务提供的检查接口,检查其他服务的业务操作是否执行成功,再根据具体的情况判断是否调用其他服务提供的重试、回滚接口。

此方案实现也比较简单,且容易理解,但是也有缺点:

  1. 和RocketMQ强绑定,因为只有RocketMQ才提供了完善的延迟消息的功能;
  2. 降低了可用性,如果Producer发送延迟消息失败,流程就终止了。

深度解析:基于 RocketMQ 实现分布式事务的技术实践与原理探究 half消息即半消息,和普通消息的区别是该消息不会立马被消费者消费,原因是half消息的存在是为了保证生产者本地事务和消费者的原子性和一致性,其过程如上文所介绍,初始发送的half消息是存储在MQ一个内存队列中(并未投递到topic中),只有生产者本地事务成功并发送commit通知后,这个消息才会被持久化到commitLog同时提交到topic队列中,此时消费者才能够消费该消息并执行本地事务。 阅读详情

相关推荐

分布式事务——纯MQ实现

一、MQ实现分布式事务,最简单的原理框架:借助MQ的消息可靠传递,实现业务间解耦、事务强一致1、>> 生产者发送消息做可靠性检查,确保消息真正投递出去;2、>> 消费者做幂等,确保业务没有重复执行;3、>> 消费者做异常重试,反复出错时需要捕捉异常并记录,以便手工干预;二、场景实践:场景以支付宝转账到余额宝为例,在支付宝已经扣款成功的情况下,余额宝一定收到转账&...

xiaoyaGrace的博客 463

MQ选手终极对决:比较几个主流MQ实现分布式事务的方案

RabbitMQ 实现分布式事务的核心思想是将事务操作拆分为消息发送和确认两个阶段,通过确认消息的方式来实现事务的提交或回滚,从而确保分布式系统的数据一致性。在分布式事务的实现中,ACK消息和半消息是两种实现分布式事务的两种不同机制,它们的共同点是都使用了两阶段提交的机制,但是它们的实现细节和适用场景有所不同。使用 ACK 消息实现分布式事务时,需要将发送消息的操作包含在本地事务中,并在本地事务提交后发送 ACK 消息来确认消息的发送。通过以上步骤,RocketMQ 实现了分布式事务的核心思想。

Hanko的专栏 2002

SCI、中科院1区算法应用:(BWO-CNN-BiGRU-Attention)白鲸优化深度学习-融合注意力机制预测程序代码!包含特征可视化,数据Excel导入,直接运行!

BWO 白鲸优化算法,于2022年发表在SCI、中科院1区期刊《Knowledge-Based Systems》上。我们利用该高创新算法对我们的CNN-BiGRU-Attention时序和空间特征结合-融合注意力机制的回归预测程序代码中的超参数进行优化。

weixin_48747334的博客 3253

MQ如何解决分布式事务?

MQ(消息队列)解决分布式事务的关键在于利用消息的可靠性和最终一致性来保证分布式系统中不同服务间事务的一致性。和。

m0_54187478的博客 1193

IPD的分析工具与模型(十六)CBB公用基础模块管理实现资源共享,缩短开发周期降低成本

CBB流程的开发环节,基于CBB规划中所识别和设计的CBB,进行CBB的详细设计(包括参数设计和接口设计),并最终实现CBB的落地开发。作为特殊类型的技术构件,CBB的开发流程,可沿用技术开发中的构件开发流程,具体包括概念、计划、开发和迁移等步骤,具体可参见前文的相关介绍。有了蓝图与架构设计,落地实施是关键攻坚。具体工作内容包括:具体工作内容包括:a. 以相似性、聚类、相对独行性、可组合、可扩展性、可维护性等原则为指导,按照产品的功能特征和业务类型,聚焦零散的功能点,形成功能模块,实现产品功能模块的划分;

Easyways1的博客 1359

电机控制-PMSM无感FOC控制(四)SVPWM——过调制

上一章我们提到了SVPWM矢量合成的范围在一个平面的矢量圆内,那么当电压矢量超出调制范围时,该怎么做呢?这就是过调制要解决的问题。电机控制-PMSM无感foc控制(三)SVPWM据之前讲解的内容我们可以知道,SVPWM技术在电压空间上模拟了一个近似于圆的电压轨迹,减小了相电流的谐波,降低了电机的谐波损耗,抑制了转矩脉动。然而,SVPWM技术也存在一些问题,合成电压矢量有极限便是其中之一。这个半径为√3/3Vdc的区域也被称作SVPWM的线性区域。

zhuxinmingde的博客 1302

java分布式 mq_Java分布式事务的四种解决方案

原标题:Java分布式事务的四种解决方案简述分布式事务指事务的操作位于不同的节点上,需要保证事务的 AICD 特性。例如在下单场景下,库存和订单如果不在同一个节点上,就涉及分布式事务。解决方案在分布式系统中,要实现分布式事务,无外乎那几种解决方案。一、两阶段提交(2PC)两阶段提交(Two-phase Commit,2PC),通过引入协调者(Coordinator)来协调参与者的行为,并最终决定这...

weixin_42303282的博客 481

从零开始:如何用PSINS工具箱构建你的第一个IMU误差模型

本文详细介绍了如何使用严恭敏教授开发的PSINS工具箱构建IMU误差模型,涵盖从基础参数设置到高级误差建模的全过程。通过imuerrset函数配置陀螺零偏、随机游走等核心参数,并结合实战案例展示消费级MEMS器件的误差建模方法,帮助用户提升惯性导航系统的精度与可靠性。

weixin_29284885的博客 319

分布式事务的四种方式方案的优缺点

目录2pc 两阶段提交方案第一阶段: 准备阶段![在这里插入图片描述](https://img-blog.csdnimg.cn/20200809205604519.png?x-oss-process=image/watermark,type_ZmFuZ3poZW5naGVpdGk,shadow_10,text_aHR0cHM6Ly9ibG9nLmNzZG4ubmV0L2xlaXN1cmVsZW4=,size_16,color_FFFFFF,t_70)第二阶段 : 提交阶段2PC的优劣优点:缺点:3PC三阶段

之城的专栏 2917

半导体设备隔振必看:如何用天棚阻尼PID控制实现VC-C级振动抑制(含SIMULINK模型)

本文深入探讨了在半导体精密制造中,如何运用天棚阻尼PID控制算法实现VC-C级振动抑制。通过构建高保真单自由度仿真模型,详细解析了从算法原理、SIMULINK实现到参数整定的全链路方案,并针对谐波扰动提供了陷波滤波器设计方法,为工程师提供了从仿真到实践的完整主动隔振技术指南。

pz89012345的博客 534

openpi 入门教程(一)安装、训练、微调与推理

OpenPI是由物理智能团队发布的机器人开源模型和软件包,包含两种主要模型:基于流的扩散视觉-语言-动作模型(VLA)的π₀模型和基于FAST动作标记器的自回归VLA的π₀-FAST模型。这些模型已在超过10,000小时的机器人数据上进行了预训练,并提供了基础模型检查点,支持开箱即用或根据用户数据集进行微调。OpenPI的实验性质意味着它可能不适用于所有平台,但鼓励研究人员和从业者进行创造性实验。运行这些模型需要至少具备NVIDIA GPU,推荐使用RTX 4090或更高规格的显卡。OpenPI支持在Ubu

2506_90492529的博客 5094

分布式事务的四种解决方案

简述 分布式事务指事务的操作位于不同的节点上,需要保证事务的 AICD 特性。 例如在下单场景下,库存和订单如果不在同一个节点上,就涉及分布式事务。 解决方案 在分布式系统中,要实现分布式事务,无外乎那几种解决方案。 一、两阶段提交(2PC) 两阶段提交(Two-phase Commit,2PC),通过引入协调者(Coordinator)来协调参与者的行为,并最终决定这些参与者是否要真...

4237

YOLOv8独家原创改进:原创自研 | 自研独家创新DSAM注意力 ,基于BiLevelRoutingAttention注意力升级

提出新颖的注意力DSAM(Deformable Bi-level SpatialAttention Module),创新度极佳,适合科研创新,效果秒杀CBAM,Channel Attention+Spartial Attention升级为新颖的Deformable Bi-level Attention+Spartial Attention

①答疑群聊服务;②YOLO大模型知识问答系统;③计算机视觉论文生成智能体; 1499

分布式事务(1)四种解决方案

简述 分布式事务指事务的操作位于不同的节点上,需要保证事务的 AICD 特性。 例如在下单场景下,库存和订单如果不在同一个节点上,就涉及分布式事务。 解决方案 在分布式系统中,要实现分布式事务,无外乎那几种解决方案。 一、两阶段提交(2PC) 两阶段提交(Two-phase Commit,2PC),通过引入协调者(Coordinator)来协调参与者的行为,并最终决定这些参与者是否要真...

攻城狮Luke 498

世界职业院校技能大赛财经赛道项目参考逐字稿五

世界职业院校技能大赛财经赛道项目参考逐字稿五

我是网络安全兼技能大赛工程师,专注网络安全技术学习与技能大赛实战!持续分享最新的技术文章,帮你少走弯路,一起在技术赛道上进步~ 106

复分析 阿尔福斯(Ahlfors) 第三版答案 英文

答案分为十章,有部分习题没有答案,全英文复分析阿尔福斯(Ahlfors) 第三版答案

上一篇: JS 原生面经从初级到高级【近1.5W字】
下一篇: Java中的语法糖(真甜)
普通网友
博客等级 码龄4年 2099粉丝 1297原创
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

个

红包个数最小为10个

元

红包金额最低5元

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

抵扣说明:

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

余额充值