分布式事务解决的方案下_世界最新

上期我们介绍分布式事务解决方案中的二阶段提交和三阶段提交。

今天将继续上期内容介绍后面三种解决方案。


(资料图)

一、什么是补偿事务?

TCC (Try Confifirm Cancel)是服务化的二阶段编程模型,采用的补偿机制:

TCC 其实就是采用的补偿机制,其核心思想是:针对每个操作,都要注册一个与其对应的确认和补偿(撤销)操作。

它分为三个步骤:

Try 阶段主要是对业务系统做检测及资源预留。

Confifirm 阶段主要是对业务系统做确认提交,Try阶段执行成功并开始执行 Confifirm阶段时,默认 Confifirm阶段是不会出错的。即:只要Try成功,Confifirm一定成功。

Cancel 阶段主要是在业务执行错误,需要回滚的状态下执行的业务取消,预留资源释放。

举个例子,假入你要向 隔壁老王转账,思路大概是:我们有一个本地方法,里面依次调用步骤: 1、首先在 Try 阶段,要先调用远程接口把 你 和 老王 的钱给冻结起来。 2、在 Confifirm 阶段,执行远程调用的转账的操作,转账成功进行解冻。 3、如果第2步执行成功,那么转账成功,如果第二步执行失败,则调用远程冻结接口对应的解冻方法 (Cancel)。

优点:

性能提升:具体业务来实现控制资源锁的粒度变小,不会锁定整个资源。

数据最终一致性:基于 Confifirm 和 Cancel 的幂等性,保证事务最终完成确认或者取消,保证数据的一致性。

可靠性:解决了 XA 协议的协调者单点故障问题,由主业务方发起并控制整个业务活动,业务活动管理器也变成多点,引入集群。

缺点:

TCC 的 Try、Confifirm 和 Cancel 操作功能要按具体业务来实现,业务耦合度较高,提高了开发成本

二、消息队列是怎么实现的?

本地消息表(异步确保)    

本地消息表这种实现方式应该是业界使用最多的,其核心思想是将分布式事务拆分成本地事务进行处理,这种思路是来源于ebay。我们可以从下面的流程图中看出其中的一些细节:

基本思路就是:

消息生产方,需要额外建一个消息表,并记录消息发送状态。消息表和业务数据要在一个事务里提交,也就是说他们要在一个数据库里面。然后消息会经过MQ发送到消息的消费方。如果消息发送失败,会进行重试发送。

消息消费方,需要处理这个消息,并完成自己的业务逻辑。此时如果本地事务处理成功,表明已经处理成功了,如果处理失败,那么就会重试执行。如果是业务上面的失败,可以给生产方发送一个业务补偿消息,通知生产方进行回滚等操作。

生产方和消费方定时扫描本地消息表,把还没处理完成的消息或者失败的消息再发送一遍。如果有靠谱的自动对账补账逻辑,这种方案还是非常实用的。

这种方案遵循BASE理论,采用的是最终一致性,笔者认为是这几种方案里面比较适合实际业务场景的,即不会出现像2PC那样复杂的实现(当调用链很长的时候,2PC的可用性是非常低的),也不会像TCC那样可能出现确认或者回滚不了的情况。

优点:

一种非常经典的实现,避免了分布式事务,实现了最终一致性。在 .NET中 有现成的解决方案。

缺点

消息表会耦合到业务系统中,如果没有封装好的解决方案,会有很多杂活需要处理。

MQ 事务消息

有一些第三方的MQ是支持事务消息的,比如RocketMQ,他们支持事务消息的方式也是类似于采用的二阶段提交,但是市面上一些主流的MQ都是不支持事务消息的,比如 RabbitMQ 和 Kafka 都不支持。

遗憾的是,RocketMQ并没有 .NET 客户端。

优点:

实现了最终一致性,不需要依赖本地数据库事务。

缺点:

实现难度大,主流MQ不支持,没有.NET客户端,RocketMQ事务消息部分代码也未开源。

三、说说Sagas事务模型

Saga模式是一种分布式异步事务,一种最终一致性事务,是一种柔性事务,有两种不同的方式来实现saga事务,最流行的两种方式是:

一、 事件/编排Choreography:没有中央协调器(没有单点风险)时,每个服务产生并聆听其他服务的事件,并决定是否应采取行动。

该实现第一个服务执行一个事务,然后发布一个事件。该事件被一个或多个服务进行监听,这些服务再执行本地事务并发布(或不发布)新的事件,当最后一个服务执行本地事务并且不发布任何事件时,意味着分布式事务结束,或者它发布的事件没有被任何Saga参与者听到都意味着事务结束。

处理流程说明:

订购服务和支付服务会监听到上面库存服务的这一事件:

支付服务会退款给客户。

订单服务将订单状态设置为失败。

优点:事件/编排是实现Saga模式的自然方式; 它很简单,容易理解,不需要太多的努力来构建,所有参与者都是松散耦合的,因为他们彼此之间没有直接的耦合。如果您的事务涉及2至4个步骤,则可能是非常合适的。

二、 命令/协调orchestrator:中央协调器负责集中处理事件的决策和业务逻辑排序。

saga协调器orchestrator以命令/回复的方式与每项服务进行通信,告诉他们应该执行哪些操作。

优点:

避免服务之间的循环依赖关系,因为saga协调器会调用saga参与者,但参与者不会调用协调器。

集中分布式事务的编排。

只需要执行命令/回复(其实回复消息也是一种事件消息),降低参与者的复杂性。

在添加新步骤时,事务复杂性保持线性,回滚更容易管理。

如果在第一笔交易还没有执行完,想改变有第二笔事务的目标对象,则可以轻松地将其暂停在协调器上,直到第一笔交易结束。

标签:

最近更新

分布式事务解决的方案下_世界最新
2023-06-29 08:28:52
横店蹲守大妈被周星驰捧红,片酬高达百万,而他却只能演网剧
2023-06-29 08:01:24
速看:掘金记者:湖人对签布鲁斯-布朗非常感兴趣 可开1230万年薪合同
2023-06-29 07:00:41
二级建造师-建筑工程法规及相关知识——工程量清单计价77
2023-06-29 06:26:01
美联储主席鲍威尔:美联储的本职工作是维持物价稳定性-每日热讯
2023-06-29 05:21:55
psp分辨率多少p_psp分辨率多少
2023-06-29 03:40:04
欧青赛以色列1-0捷克小组第二晋级,甘德尔曼一锤定音
2023-06-29 01:42:39
北京密云:打好“生态牌” 走好绿色高质量发展之路 天天即时
2023-06-28 23:05:07
艾布鲁(301259)股东钟儒波质押650万股,占总股本4.17%
2023-06-28 22:11:24
景逸X5的发动机几个缸|热推荐
2023-06-28 21:35:07
全球报道:饼干老师明星糖果
2023-06-28 20:52:31
今日快看!离岸人民币兑美元跌破7.26
2023-06-28 20:18:08
女子骑车不慎摔倒致牙齿脱落,南京江北交警暖心陪护送医_环球精选
2023-06-28 20:02:24
奥迪Q7评估:豪华中大型SUV的完美之选-全球快讯
2023-06-28 19:08:38
汇量科技(01860)6月28日斥资71.15万港元回购20.3万股
2023-06-28 18:48:00
韩国4月新生儿数量创42年来新低!仅招到91名新生 首尔一百年名校将关闭
2023-06-28 18:38:33
施罗德再谈2年前和欧文之间的争吵,表示已经重新获得尊重|当前资讯
2023-06-28 18:04:45
我省发布最新灾害风险提示_世界观焦点
2023-06-28 17:33:25
焦点热议:跟着“京味儿话剧”《向阳里8号楼》,看看真实的“筒子楼生活”
2023-06-28 17:16:41
订单号在哪里看拼多多(订单号在哪里看)
2023-06-28 16:45:04
人才引用当有“三忌”|实时焦点
2023-06-28 16:11:27
[快讯]宇洪科技公布2022年年度分红实施方案-世界时快讯
2023-06-28 15:44:43
当前热讯:国家北斗地基增强系统完成全面安全升级
2023-06-28 15:41:17
2024qs世界大学排名中国大陆完整榜单 全球快报
2023-06-28 15:08:29
中药行业研究周报:首批全国中成药集采落地 持续关注中药创新等主线 全球观速讯
2023-06-28 14:27:02
天天短讯!卡罗拉12版 卡罗拉12t的致命缺点
2023-06-28 13:51:45
聚焦:国家统计局:2023年1—5月份全国规模以上工业企业利润下降18.8%
2023-06-28 13:06:18
《女子推理社》女推团全力营救刘迎迎,隔门躲避搜捕压迫感拉满 全球聚看点
2023-06-28 12:27:02
【播资讯】东体:国安训练强度大幅提升,高温下苏亚雷斯必须考虑阵容架构
2023-06-28 11:58:29
长春市科技赋能服务“三农” 世界今亮点
2023-06-28 11:23:11