转载本文需注明出处:微信公众号EAWorld,违者必究。数据库
分布式事务解决的问题很明确,就是在服务分布在不一样进程、数据分布在不一样数据库时,如何解决数据一致性问题。对于这个问题,业界的共识是不要启用数据库 XA 模式,由于分布式状况下,若是启用了 XA 事务,必然会有数据库锁存在,实际上形成了两个服务之间的耦合,与分布式服务的初衷背离,还不如部署在一块儿。在不使用 XA 的状况下,常用业务补偿和TCC(Try/Confirm/Cancel)模式的服务来解决:为何有这样两种模式呢,他们有什么区别,各自适合什么样的场景,这两种模式是否带来了代码开发的复杂度?常常有人问我这样的问题,这里简单说明一下:微信
用补偿交易保证数据一致性架构
解决数据一致性问题,能够经过业务补偿的方式完成。实际上业务补偿是一种业务提出的要求,在银行咱们能够把交易(服务)分为帐务类和查询类交易(在这里服务和交易是等同的,我就再也不专门区分了),对于帐务类交易,能够提供补偿交易,一旦业务失败能够调用补偿交易,经过冲正等方式进行,如何补偿在业务上是有明肯定义的,不能随意而为。(不要担忧这样作开发起来复杂了,这是必须作的需求)。框架
当年不少业务在失败的时候,是由人工发起补偿交易的(我在阿里展览馆就要这样的展品,在一个小本本上手工记录的交易金额、流水号等,早期的支付宝就是这样冲正的)。这样作法效率低,咱们就但愿可以经过技术手段,在业务失败的时候自动发起补偿交易,减小人工参与。为此,咱们能够开发一个自动补偿的框架,记录每一个处理过的业务交易流水,在处理某个交易失败的时候,依次调用补偿交易,流程以下:分布式
TCC服务(交易)的使用场景微服务
银行的帐务类交易除了补偿类交易以外,还有一种 TCC 类型的服务,这类交易的 T 是 Try 的一块儿,也就是开始时预留资源,在 Confirm 的时候改变最终资源,或者在 Cancel 的时候释放预留资源。例如,在银行帐目中,都有余额和可用余额两个字段,在 T 的时候,首先改变可用余额,业务上用可用余额来进行判断,而不是用实际余额判断,在 Confirm 的时候,修改实际余额,在 Cancel 的时候,修改可用余额。大数据
这样作的好处是,在业务失败的状况下,实际余额不会出现变化。我常常遇到的问题是:云计算
有了补偿服务为何还要 TCC,有什么好处,为何不能直接修改帐户余额;设计
TCC 服务要用什么样的框架实现。3d
TCC 这种作法有什么好处
之前面帐户余额和可用余额的例子看,帐户余额的调整会涉及到不少方面,不只仅是一个字段数值的更新,根据会计原则,帐户余额的变化须要生成会计分录、登记帐务流水、计算利率变化、计算税率变化等等,除此以外,帐户余额的变化还会引发关联帐户的变化,牵一发动全身。在业务失败的时候,若是调用补偿交易,就须要对上述操做作处理,业务处理太复杂,得不偿失。所以,通常会设计一个可用余额,首先改变可用余额,业务成功时再调整帐户实际余额。根据这个示例,咱们也能够清楚,在什么场景下须要 TCC 服务了。其实,在金融交易中,就有专门的预付费交易,就能够用来支持 TCC 模式。
(点击图片可放大)
TCC 服务要用什么样的框架实现?
从上述示例能够看出,TCC和补偿式交易同样,都是为了知足业务的要求,而这些交易刚好能够用来为数据一致性服务,TCC服务的 T、C、C实现,彻底是根据业务须要实现,不可能有一个统一的实现框架,例如帐户余额的作法和库存余额的作法,多是差距很大的,没有必要抽象出来。互联网上虽然有实现 TCC 服务的方式,可是也都是针对特定业务的,不具有通用型。
可是,为何每每有人提出,框架要支持 TCC 呢,究其缘由是把 TCC 服务和数据一致性框架混为一谈了,前者是一个服务实现,后者是利用服务的特色保证数据完整性,减小人工操做。
数据一致性框架,除了利用 TCC/补偿服务的框架以外,还有利用幂等服务特性实现的重试性框架,也就是利用交易的幂等特性,反复进行重试,若是屡次重试仍是不成功,只有采用人工手段了。
总结一下:
补偿类服务和 TCC 服务是处理重要信息变动的两种模式,能够经过这两种模式,来支持数据一致性。这两种方式都是特定业务的须要,而不是 XA事务、重试这样,用一种技术手段实现数据一致性。对于简单的业务来讲,这两种方式是没有必要的,可是对于重要信息的变动,尤为是分布式系统从渠道、中台、核心多环节完成信息变动时,这是必须的。
关于做者:焦烈焱,普元信息CTO,致力于技术创新和金融创新解决方案研究。专一于企业技术架构领域,对分布式环境的企业计算、 企业信息架构的规划与实践有着丰厚经验,带领普元技术团队相继在云计算、大数据及移动开发领域取得多项突破,并主持中国工商银行、中国建设银行等多家大型企业技术平台的规划与研发。
关于EAWorld:微服务,DevOps,数据治理,移动架构原创技术分享。长按二维码关注!