时间:2022-09-14 | 标签: | 作者:Q8 | 来源:网络
小提示:您能找到这篇{支付宝蚂蚁金服怎么在分布式架构下保证转账业}绝对不是偶然,我们能帮您找到潜在客户,解决您的困扰。如果您对本页介绍的支付宝蚂蚁金服怎么在分布式架构下保证转账业内容感兴趣,有相关需求意向欢迎拨打我们的服务热线,或留言咨询,我们将第一时间联系您! |
概述本文以分布式架构下的转账服务为业务场景,先阐述分布式架构下跨数据库转账遇到的数据一致性问题;再详细介绍如何使用行业常见的分布式事务解决方案靠谱的品牌公关费用(消息事务、冲正补偿、JTA/XA),以及蚂蚁的分布式事务(DTX),解决跨库转账的数据一致性问题,并列举了各种解决方案的优劣势。 通过对比各种分布式事务解决方案,您会发现,分布式事务有丰富的接入模式,能应对各种复杂的业务场景,接入维护简单,性能优异,行业优势明显。 需求背景和技术问题需求描述转账是金融机构日常业务中的常见场景。假设用户 A为转账发起方,从自己的账户余额中转出一笔资金至用户 B 的账户中。此操作涉及两部分:“A 账户的扣钱”和“B 账户的加钱”,这两个操作要都成功才算转账成功。 ▲ 用户 A 向用户 B 转账 如果一个操作成功而另一个操作失败(比如:B 账户加钱成功,A 账户扣钱失败),则会出现总体资金数据不一致,造成资金损失;故转账服务的中的“加钱”和“扣钱”操作必须在一个事务内,要么都成功,要么都失败。 在非分布式架构下,用户 A、用户 B 的账户数据都在同一个数据库中,可以使用数据库事务来保证“加钱”和“扣钱”操作的在一个事务内。 但是在分布式架构下,用户 A 的账户数据、用户 B 的账户数据会分别存储在不同数据库中,此时便无法再使用数据库事务来保证“加钱”和“扣钱”操作的原子性,需要考虑能保证数据一致性的解决方案。 需求分析▲ 用户 A 发起转账业务 如上图所示,在分布式架构下,用户 A 发起转账操作,向用户 B 转账 100 元。 转账过程中,首先是在数据库 A 中扣除账号 A 的 100 元,紧接着是在数据库 B 中给账户 B 加 100 元。 “数据库 A 上账户 A 扣款操作”、“数据库 B 上账户 B 加钱操作”都成功才算转账成功;如果一个操作成功,另一操作失败(比如:账户 B 加钱成功,账户 A 扣钱失败),则会出现资金数据不一致,造成资金损失;如果加钱操作和扣钱操作丢失败,那么转账是失败的,但是不会有资金损失。 故需要保证数据库 A、数据库 B 上的更新操作都成功或者都失败;整个资金数据最终是一致的。 技术问题分布式架构下,用户 A、用户 B 的账户数据存储在不同的数据库中,需要引入能保证跨数据库的多个操作在一个事务内的解决方案,以保证转账操作的原子性,保障跨库转账时的资金安全。 下文将介绍目前常见的分布式事务解决方案,并将其应用到转账场景,以解决跨库转账时的数据一致性问题。 行业分布式事务解决方案分布式事务是指事务中资源分布于网络中的多个不同节点的事务。 ▲ 分布式事务中的事务管理器与资源管理器 如上图所示,分布式事务有一个事务管理器(Transaction Manager)和多个资源管理器(Resource Manager)组成:
在本文的转账案例中,转账服务便是事务管理器(发起方),转账服务内部执行“扣钱”、“加钱”动作是事务的参与者。 二阶段提交协议(2PC)是分布式事务的基础协议,在此协议中,事务管理器分两个阶段协调资源管理器。 ▲ 二阶段提交 如上图所示,在第一阶段,事务管理器向所有资源管理器发生准备请求,如果所有资源管理返回准备成功,那么在第二阶段事务管理器向所有资源发生提交请求,完成所有资源的提交。 如果有任一资源管理一阶段准备失败,那么在第二阶段事务管理器向所有资源发生回滚请求,完成所有资源的回滚。 目前常见的分布式事务解决方案均采用二阶段提交协议实现。 下文将以转账场景为例,分别介绍非事务解决方案和常见的分布式事务解决方案,了解它们是如何保障分布式架构下跨库转账的原子性,保障资金数据的一致性。 非事务解决方案▲ 转账操作流程 如上图所示,在非分布式事务解决方案中,转账操作会依次执行“A 账户扣除 100 元”、“B 账户增加 100 元”,最后完成转账操作。整个转账操作内部有两个操作,分别是:“A 账户扣钱”、“B 账户加钱”,我们把这两个操作抽象成扣钱服务(MinusAction)和加钱服务(AddAction):
▲ 转账服务流程 如上图所示,转账服务会依次调用 MinusAction 服务的 minus 方法完成 A 账户的扣款,AddAction 服务的 add 方法完成 B 账户的加钱。整个转账过程中,未引入任何分布式事务解决方案来保证转账操作(加钱操作、扣钱操作)的原子性。正常情况下,加钱操作和扣钱操作都执行成功,这种实现方式不会有问题。但是在异常情况下(比如:A 账户扣钱成功,但是 B 账户加钱失败,此时 A 账户扣掉的钱将无法恢复),会出现资金数据不一致,给用户造成资金损失。因此,在金融行业,这种解决方案是不可取的,必需引入分布式事务解决方案来保障转账服务的原子性。 消息事务解决方案▲ 消息事务业务流程 消息事务是一种比较常见的分布式事务解决方案。如上图所示,引入了消息事务解决方案来解决转账操作的事务问题。 转账服务内部使用消息事务功能,发送加钱消息给加钱服务,同时在消息事务回调方法内调用扣钱服务完成 A 账户的扣钱;A 账户扣钱成功则加钱消息发送成功,否则加钱消息发送失败;消息发送完成之后,转账服务返回结果,消息事务一阶段完成。 在第二阶段订阅消息,消息消费时,调用加钱服务完成 B 账户的加钱;B 账户加钱成功则消息消费成功;否则消息消费失败,消息队列下个周期重试投递消息。 消息事务解决方案分析
消息事务解决方案问题
冲正补偿解决方案冲正补偿也是分布式事务比较常用的一种解决方案,冲正补偿可以解决消息事务二阶段不可逆的问题。 各个业务参与者(加钱、扣钱动作)需要分别实现正向业务操作,以及其逆向回滚操作。 事务协调者先执行所有参与者正向业务操作,如果所有参与者正向操作均成功,那么整个业务就算成功;如果任意参与者正向操作执行失败,那么协调者会去执行所有参与者的逆向操作,让事务回滚。转账的冲正补偿实现如下图所示: ▲ 冲正补偿业务流程 冲正补偿解决方案中,每一个业务操作均需要实现正向和逆向两个操作;对于扣钱服务,除了扣钱操作外,还需要实现其方法的回滚操作;对于加钱服务,除了加钱操作外,还需要实现其回滚操作。 冲正补偿解决方案分析
冲正补偿解决方案问题
JTA/XA 解决方案JTA/XA 解决方案通过 JTA API 调用数据库的 XA 接口,协调各个数据库上的 XA 事务的提交和回滚。 ▲ JTA/XA 业务流程 如上图所示,加钱操作、扣钱操作分别调用数据库 A、数据库 B 的 JTA/XA API。JTA/XA API 能帮助用户分二阶段协调各个数据库上 XA 事务的同步提交和回滚。 JTA/XA 解决方案分析
JTA/XA 解决方法下,数据库 XA 事务作为资源管理器,用户自己作为事务协调者,调用 JTA 接口操作 XA 事务。 JTA/XA 解决方案的问题
蚂蚁金服分布式事务解决方案前文介绍了消息事务、冲正补偿等解决方案及其问题,接下来我们将介绍使用蚂蚁金服的分布式事务(DTX)解决方案来实现转账操作。 分布式事务有两种模式:TCC 模式和 FMT 模式:
下面我们将分别介绍如何使用 TCC 模式、FMT 模式实现转账操作。 TCC 模式解决方案TCC 即 Try-Confirm-Cancel 的缩写,是服务化的二阶段提交(2PC)编程模型:
TCC 模式需要用户将“A 账户扣钱”、“B 账户加钱”均分成二阶段实现,在第一阶段检查预留资源,在二阶段提交时执行实际的扣钱、加钱操作,二阶段回滚时释放预留资源。 使用分布式事务的 TCC 模式,需要用户设计、实现个业务动作的 TCC 服务,此 TCC 服务有 3 个方法,分别是一阶段的准备方法(Try)、二阶段的提交方法(Confirm)和二阶段的回滚方法(Cancel)。 ▲ 转账 TCC 业务流程 如上图所示,TCC 模式的转账操作描述:
在转账方法内部,用户只需要显示调用各个参与者(A 账户扣钱参与者、B 账户加钱参与者)的一阶段方法,无需关注参与者的二阶段方法调用(参与者二阶段方法由分布式事务框架来调用,分布式事务框架会根据转账方法返回结果是成功还是失败,来决定是去调用各参与者二季度的提交方法还是回滚方法)。 TCC 模式优点
TCC 模式问题接入成本较高。用户接入过程中,需要考虑如何将业务动作分成二阶段完成,需要在第一阶段预留资源,以保证第二阶段的提交一定能成功。此外,TCC 参与者实现时还需要考虑幂等控制、防悬挂等,这些都增加了 TCC 模式的接入成本。 FMT 模式解决方案针对 TCC 模式接入成本高的问题,分布式事务开发了 FMT 模式。FMT 模式的接入成本极低,用户无需实现 TCC 参与者,只需要极少的改动业务代码即可接入分布式事务。 FMT 模式优点接入简单、快捷;对业务代码改动少。 FMT 模式问题在实现上,为了防止数据的无效读写等问题,添加了行锁;相对于几乎无锁的 TCC 模式,性能稍弱。 分布式事务与行业解决方案对比与消息事务相比
与冲正补偿相比
与 JTA/XA 相比
总结相较于消息事务、冲正补偿、JTA/XA 等解决方案,分布式事务提供了多种模式和解决方案,在性能、易用性、运维成本等方面均有较出色的表现,是目前行业内领先的分布式事务解决方案。 分布式事务提供了两种模式:TCC 模式、FMT 模式。如果比较看重易用性,可以选择使用 FMT 模式;如果业务逻辑比较复杂,对性能要求比较高,可以选择 TCC 模式。 原创日期:2018-04-04 原文作者:绍辉 |
上一篇:支付宝蚂蚁金服分布式事务中的二阶段怎么进行
下一篇:支付宝蚂蚁金服-素描单元化
小提示:您应该对本页介绍的“支付宝蚂蚁金服怎么在分布式架构下保证转账业”相关内容感兴趣,若您有相关需求欢迎拨打我们的服务热线或留言咨询,我们尽快与您联系沟通支付宝蚂蚁金服怎么在分布式架构下保证转账业的相关事宜。
关键词:支付宝蚂蚁金服