微服务--分布式事务的实现方法及替代方案

数字孪生在智慧医疗中的5个创新应用:从手术模拟到个性化治疗 数字孪生技术通过创建患者或医疗流程的动态虚拟映射,正在深刻变革智慧医疗。本文重点剖析了其在个性化治疗、手术模拟与导航、药物研发、医院管理优化及慢性病管理五大核心场景的创新应用,展现了如何利用智能映射与数据融合,为精准医疗和高效决策提供强大支持。 阅读详情

这两天正在研究微服务架构中分布式事务的处理方案, 做一个小小的总结, 作为备忘. 如有错误, 欢迎指正!

概念澄清

  • 事务补偿机制: 在事务链中的任何一个正向操作, 都必须存在一个完全符合回滚规则的可逆操作, 这个操作通常叫做rollback或者cancel.

  • CAP理论: CAP(Consistency, Availability, Partition Tolerance), 阐述了一个分布式系统的三个主要方面, 只能同时择其二进行实现. 常见的有CP系统, AP系统.

    为什么CA不行呢? 因为没有P的话, 数据一致性会出现问题, 这是任何一个一致性系统不允许出现的情况.

  • 幂等性: 简单的说, 业务操作支持重试, 不会产生不利影响. 常见的实现方式: 为消息额外增加唯一ID.

  • BASE(Basically avaliable, soft state, eventually consistent): 是分布式事务实现的一种理论标准.

柔性事务 vs. 刚性事务

刚性事务是指强一致性事务, 例如单机环境下遵循ACID的数据库事务, 或者分布式环境中的2PC等.

柔性事务是指遵循BASE理论的事务, 通常用在分布式环境中, 常见的实现方式有: 异步确保型, 最大努力通知型.

最佳实践

先上结论, 再分别介绍分布式事务的各种实现方式.

  • 如果业务场景需要强一致性, 那么尽量避免将它们放在不同服务中, 也就是尽量使用本地事务, 避免使用强一致性的分布式事务(例如2PC).
  • 如果业务场景能够接受最终一致性, 那么最好是使用异步确保型来解决(实际上大部分互联网公司的业务都是这么玩儿的).

注意: 以下每种方案都有不同的适用场合, 需要根据实际业务场景来选择.

两阶段提交(2PC)

两阶段提交(Two Phase Commit, 2PC), 具有强一致性, 是CP系统的一种典型实现, 是数据库层面的强一致性事务实现.

两阶段提交, 常见的标准是XA等. 例如Oracle的数据库支持XA, MySQL从5.5开始支持XA.

下图是两阶段提交的示意图:

2pc

图的上半是两阶段提交成功的演示, 下半是两阶段提交失败的演示. 关于两阶段提交网上有很多经典的讲解, 这里就不细说了, 可以参考前面的链接.

优点

  • 依赖数据库服务提供商的XA实现来使用2PC, 无需像TCC那样每个服务都需要手工编写TCC接口实现类.

缺点

  • 事务管理器单点失败
  • 高并发不适用, 资源加锁时间较长, 无法灵活控制锁粒度(db层面的锁在2PC期间会一直被持有, 相较于TCC而言不灵活, 因为无法在tcc的中间阶段解锁.).

TCC (Try-Confirm-Cancle)

TCC是应用层的2PC, 具有最终一致性.

TCC实例-实时服务

以上图中的A->B实时汇款服务为例. 假设汇款服务和收款服务位于两个不同的微服务中.

  1. 首先服务主调方充当事务管理器的角色, 注册汇款收款服务的TCC接口.

  2. 事务开始, 进入TCC事务中的TRY阶段.

    1. 调用汇款服务的try接口, 检查A账户有效性(不在冻结状态), 余额充足性, 并扣减转账金额.
    2. 调用收款服务的try接口, 检查B账户的有效性(不为冻结状态).
  3. 检查所有被调服务的try返回值:

    • 如果任一服务try失败, 那么会自动调用所有服务对应的cancel方法, 对于A账户, 就是将余额加回; 对于B账户, 不做任何操作.
    • 如果所有服务的try均成功, 那么会自动调用所有服务对应的confirm方法, 对于A账户, 不做任何操作; 对于B账户, 增加汇款金额

    注意: 如果任一cancel或confirm失败, 需要不断重试直到成功或人工介入.

  4. 事务结束.

优点

对比与前面提到的2PC, 主要优势是:

  • 可自由控制锁粒度(在应用层控制);

缺点

  • 事务管理器单点失败.

  • 每个服务都要实现TCC接口, 较为复杂.

  • 若允许并发操作, Confirm和Cancel操作无法幂等(可通过额外信息例如唯一事务id实现).

    因为数据库级别的事务不允许脏读, 不存在数据一致性问题, 所以数据库级别的rollback设计是幂等的; 而TCC为了避免数据一致性问题, 只能通过补偿型操作实现. 这就导致Confirm和Cancel操作本身不可能幂等, 解决方案有两种:

    1. 通过事务id操作去重;
    2. 在confirm或cancel阶段, 只有明确收到confirm或cancel的失败反馈才能重试, 否则需要log而后人工介入.

适用场景

  • 严格一致性
  • 执行时间短
  • 实时性要求高

举例: 红包, 收付款, 实时汇款业务.

异步确保型

通过将一系列同步的事务操作变为基于消息执行的异步操作, 避免了分布式事务中的同步阻塞操作的影响.

这个方案真正实现了两个服务的解耦, 解耦的关键就是异步消息和补偿性事务.

这里以一个例子作为讲解:

异步确保型

执行步骤如下:

  1. MQ发送方发送远程事务消息到MQ Server;
  2. MQ Server给予响应, 表明事务消息已成功到达MQ Server.
  3. MQ发送方Commit本地事务.
  4. 若本地事务Commit成功, 则通知MQ Server允许对应事务消息被消费; 若本地事务失败, 则通知MQ Server对应事务消息应被丢弃.
  5. 若MQ发送方超时未对MQ Server作出本地事务执行状态的反馈, 那么需要MQ Servfer向MQ发送方主动回查事务状态, 以便进一步处理未投递的事务消息(丢弃或投递).
  6. 当得知本地事务执行成功时, MQ Server允许MQ订阅方消费本条事务消息.
  7. 消费者消费完之后, 需要ack到MQ Server, 之后事务消息才能从MQ Server删除. 否则消费者需要一直重试, 直到成功或者人工介入.

注意事项

  • 消息中间件在系统中扮演一个重要的角色, 所有的事务消息都需要通过它来传达, 所以消息中间件也需要支持HAC来确保事务消息不丢失.
  • 根据业务逻辑的具体实现不同,还可能需要对消息中间件增加消息不重复, 不乱序等其它要求.

适用场景

  • 执行周期较长
  • 实时性要求不高

例如:

  • 非实时汇款业务
  • 退货/退款业务
  • 财务, 账单统计业务(先发送到消息中间件, 而后可进行批量记账)

最大努力通知型

这是分布式事务中要求最低的一种, 也可以通过消息中间件实现, 与前面异步确保型操作不同的一点是, 在消息由MQ Server投递到消费者之后, 允许在达到最大重试次数之后直接结束事务, 无需人工介入确保成功.

优点

  • 高并发, 低耦合

缺点

  • 不支持回滚;

适用场景

交易结果消息的通知等.

SAGA

将一个大事务拆成一串小事务, 分段提交和回滚.

可能的执行序列:

  • 成功: T1, T2, T3, …, Tn;
  • 失败: T1, T2, , T3, …, Tn-1, Cn-1, Cn-2, Cn-3, …, C1

缺点

  • 有数据一致性问题:

    举个例子, 定义:

    • T1=扣100元 T2=给用户加一瓶水 T3=减库存一瓶水
    • C1=加100元 C2=给用户减一瓶水 C3=给库存加一瓶水

    如果在T3失败进行回滚, 此时用户已经把水喝了, 那么就会造成回滚失败, 出现数据一致性问题. 根本原因是没有了tcc的try阶段预留资源导致的. 解决方案就是要么在所有资源上加锁, 要么严格控制t的顺序, 将回滚困难的放在最后.

小结

不管是同步事务中的事务管理器(协调者), 还是异步事务中使用的消息中间件,若要达到一致性保证,都需要使用带有同步复制语义的HAC提供的高可用和高可靠特性,这些都是以性能为代价的,无疑成为了SOA架构中的典型性能瓶颈之一.

不同方案对比

分布式事务实现方案对比


本文链接: http://blog.youkuaiyun.com/congyihao/article/details/70195154

参考链接

Mstar的Monitor方案OSD 菜单制作(五)——icon绘制 Mstar的Monitor方案(五)————绘制icon 阅读详情

相关推荐

VScode利用EIDE和cortex-debug进行stm32开发(也适用51)

你是否因为keil页面太丑而烦恼,你是否因为keil编译太慢而恼怒,ok阿,今天也是给大家带来怎么在vscode上进行stm32的编程(我不会告诉你,我搞了好几天才搞好的💔💔💔)为什么是简单介绍?因为太啰嗦了,我嫌麻烦😋,大家可以去EIDE的官方文档去看。

weixin_73952614的博客 9395

分布式事务的七种实现方式

文章目录一、前言二、强一致性、弱一致性、最终一致性三、从事务到分布式事务3.1 从事务到分布式事务3.2 分布式事务的实现方式3.2.1 两阶段提交 实现分布式事务3.2.2 三阶段提交 实现分布式事务3.2.3 TCC(Try尝试、Confirm确认、Cancel取消)实现分布式事务3.2.4 最大努力通知 实现分布式事务(略,有单独博客)3.2.5 MySQL基于XA 实现分布式事务(略,有单独博客)3.2.6 ebay本地消息表(ebay研发出的)实现分布式事务3.2.7 半消息/最终一致性(Rock

毛毛的专栏 1万+

电机FOC控制实战:STM32 CubeMX配置六路互补PWM与死区优化

本文详细介绍了如何使用STM32 CubeMX配置六路互补PWM与死区优化,实现电机FOC控制。通过实战经验分享,包括时钟配置、定时器设置、死区时间计算及优化技巧,帮助开发者避免常见问题,提升电机控制性能。特别适用于STM32G4系列的无刷电机驱动应用。

weixin_29193259的博客 402

分布式事务

现在面试,分布式系统成了标配,而分布式系统带来的分布式事务也成了标配了。因为你做系统肯定要用事务吧,如果是分布式系统,肯定要用分布式事务吧。先不说你搞过没有,起码你得明白有哪几种方案,每种方案可能有啥坑?比如 TCC 方案的网络问题、XA 方案的一致性问题。 分布式事务的实现主要有以下 5 种方案: XA 方案 TCC 方案 本地消息表 可靠消息最终一致性方案 最大努力通知方案 两阶段...

Talk is cheap,show me the code. 1134

ROS实践(四)机器人SLAM建图(gmapping)

本文介绍了SLAM技术及其实现方法。SLAM(同步定位与地图构建)让机器人在未知环境中通过传感器数据自主定位并构建地图。文章详细讲解了激光雷达、RGBD相机等常用传感器,以及gmapping和map_server这两个ROS功能包的使用方法。重点阐述了SLAM建图实验步骤:配置gmapping节点参数、启动机器人仿真、运行gmapping节点、使用rviz可视化工具、通过键盘遥控机器人完成地图构建并保存。实验结果表明,该方法能有效实现机器人自主建图功能,为后续导航等应用奠定基础。

qq_1033275663的博客 4336

Intouch间接变量(扩展)

间接变量只是Intouch提供给开发者的便捷方式之一,并不是所有情况都一定要使用间接变量,有时候用条件语句或者内存变量的方式也能起到类似的作用。

weixin_41571357的博客 2168

分布式事务的实现方式

分布式事务的实现方式

m0_60259116的博客 1696

配电网故障重构/孤岛划分/故障恢复

程序主要复现《基于GA_BFGS算法的配电网故障恢复性重构研究_郑海广》,采用matlab编程软件实现,依据网络结构和DG供电方式对配电网进行孤岛划分,将含有 DG 的配电网拓扑结构看成一个树,搭建成连通图模型,使得将孤岛的划分变成了求取最小生成树,以网损和开关开断次数作为目标,采用 IEEE33 节点配电网为算例,通过遗传算法寻优计算,从而得到最佳的重构方案。

zhangxd212489的博客 2500

分布式事务的七种实现方案汇总

背景 随着微服务的普及,分布式事务成为了系统设计中不得不面对的一个问题,而分布式事务的实现则十分复杂。阅读本文之前,需要你对数据库事务的ACID、CAP理论、Base理论以及两阶段提交有一定的认知,不熟悉者请自行百度或者阅读参考博客1、2、3和4。除此之外,在阅读本文过程中,如果对某种方案不理解,强烈建议先阅读对应方案中的参考博客后再阅读本文中对应的介绍。 为了便于后文叙述,这里对ACID中的C(一致性)做一个强调:严格的事务一致性是使数据库从一个一致性状态变到另一个一致性状态,且事务中间状态不能被观察

leeta的博客 5348

C++动态规划详解

动态规划思想 一、动态规划概念: 动态规划(dp)是研究多步决策过程最优化问题的一种数学方法。在动态规划中,为了寻找一个问题的最优解(即最优决策过程),将整个问题划分成若干个相应的阶段,并在每个阶段都根据先前所作出的决策作出当前阶段最优决策,进而得出整个问题的最优解。即记住已知问题的答案,在已知的答案的基础上解决未知的问题。 在这类问题中,可能会有许多可行解。每一个解都对应于一个值,我们希望找到具有最优值的解。动态规划算法与分治法类似,其基本思想也是将待求解问题分解成若干个子问题,先求解子问题,然后

weixin_51951103的博客 2万+

Qt5.15.2配置安卓环境

否则,将会跳转到github,你可以自行下载解压到你设置的目录中,然后Qt会自动检测到。以上所需的工具确实有些繁多,而且如果单独下载又涉及科学上网问题,版本问题十分麻烦,好在Qt Creator 4.12之后已经可以自动下载SDK工具,NDK,基础包,openssl,以及gradle等,十分省心。回到正题,无论通过在线安装的方式,安装时勾选了Android,还是编译的方式,编译时编译了Qt Android库,想要使用Qt开发安卓应用仍然需要一些其他工作,包括安装编译安卓项目需要的SDK,NDK等。

weixin_41392061的博客 979

微服务分布式事务的几种解决方案及应用场景

微服务分布式事务的几种解决方案及应用场景

Xiaofeng_Lu__的博客 3449

【雕爷学编程】Arduino智能家居之DS18B20温度传感器

1、温度和湿度控制:通过连接温度传感器和湿度传感器,Arduino可以实时监测室内环境的温度和湿度,并通过控制空调、加热器或加湿器等执行器,实现室内温湿度的自动调节。设计用户友好的界面和操作方式,提供简单直观的控制和反馈机制,以及考虑用户习惯和需求,能够提升系统的整体用户体验。这意味着用户可以根据自己的需求和创意,自定义和定制智能家居系统的功能和外观。5、能源管理:Arduino可以与电能监测模块和智能插座等设备结合使用,实时监测家庭能源的使用情况,并通过自动控制电器设备的开关,实现能源的有效管理和节约。

雕爷学编程 2875

Spring--微服务分布式事务的实现方法及替代方案

微服务–分布式事务的实现方法及替代方案这两天正在研究微服务架构中分布式事务的处理方案, 做一个小小的总结, 作为备忘. 如有错误, 欢迎指正!概念澄清事务补偿机制: 在事务链中的任何一个正向事务操作, 都必须存在一个完全符合回滚规则的可逆事务.CAP理论: CAP(Consistency, Availability, Partition Tolerance), 阐述了一个分布式系统的三个主要方面,...

blues的博客 8667

温度PID控制PLC程序

温度PID稳定控制程序,适用于欧姆龙PLC,对其他PLC也具有很大参考价值

Statistics and Machine Learning Toolbox

Statistics and Machine Learning Toolbox(带书签),MATLAB统计学习工具

微服务分布式事务的实现方法及替代方案

2019独角兽企业重金招聘Python工程师标准>>> ...

weixin_33941350的博客 114

Devexpress16.2.6破解工具

Devexpress16.2.6破解工具Devexpress16.2.6破解工具Devexpress16.2.6破解工具Devexpress16.2.6破解工具

【微服务】分布式事务的实现方法及替代方案

作者 | congyh来源 | csdn这两天正在研究微服务架构中分布式事务的处理方案, 做一个小小的总结, 作为备忘. 如有错误, 欢迎指正!概念澄清事务补偿机制: 在...

JAVA葵花宝典 477

汉书HE8,好用的汇编代码编写工具

汉书HE8,好用的汇编代码编写工具早期编写汇编代码所用功能强大

微服务–分布式事务的实现方法及替代方案

微服务–分布式事务的实现方法及替代方案 这两天正在研究微服务架构中分布式事务的处理方案, 做一个小小的总结, 作为备忘. 如有错误, 欢迎指正! 概念澄清 事务补偿机制: 在事务链中的任何一个正向事务操作, 都必须存在一个完全符合回滚规则的可逆事务.CAP理论: CAP(Consistency, Availability, Partition Tolerance), 阐述了一个分

hds_1988的博客 339

微服务--分布式事务的实现方法及替代方案(转)

概念 事务补偿机制: 在事务链中的任何一个正向事务操作, 都必须存在一个完全符合回滚规则的可逆事务. CAP理论: CAP(Consistency, Availability, Partition Tolerance), 阐述了一个分布式系统的三个主要方面, 只能同时择其二进行实现. 常见的有CP系统, AP系统. 幂等性: 简单的说,业务操作支持重试, 不会产生不利影响. 常见的实现方式...

帅性而为1号的博客 496
上一篇: Spring核心技术--AOP
下一篇: JWT(JSON Web Token) - 在Web应用间安全地传递信息
congyh
博客等级 码龄15年 43粉丝 38原创
评论 10
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

个

红包个数最小为10个

元

红包金额最低5元

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

抵扣说明:

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

余额充值