转载本文需注明出处:EAWorld,违者必究。
针对分布式架构下的数据一致性,你们也许会问这样的问题:跨系统间分布式事务如何解决?系统内多个服务的分布式事务如何解决?一个服务内多个数据源/数据库的分布式事务如何解决?……这些问题你们是很容易理解的,可是因为术语不许确,因此解释起来会有二义性,因此先要统一语言或者术语,也就是统一律念:
域是一个虚拟的分类,几个系统属于某一个域,例如网上银行和手机银行都属于电子渠道领域;
传统的单体应用,指的就是系统,在微服务架构下,单体应用采用先后端分离模式,前端通常使用 Nginx,Ngnix 进程间采用主备模式,系统的后端能够分为多个应用,每一个应用有一组对等的应用进程(也称为应用实例)提供服务,每一个应用对应一个数据库,实际上在分库的状况下,有可能一个应用对应多个数据库。复杂一点的是网关,网关由一组对等的网关实例组成,若是多个系统共享一个网关,网关和系统就是1对多的关系,也能够一个系统独享一个网关,就是一对一状况,下图是一个概念的示例,使用的是系统独享网关模式。
这里,咱们看看常常问的一些问题:跨系统间分布式事务、系统内多个服务的分布式事务、一个服务内多个数据源/数据库的分布式事务,这些问题彻底是从技术的角度作概括,用上述概念应该改成:系统间的数据一致性、系统内应用间的数据一致性、应用内部对应多数据库的数据一致性,另外能够增长一个数据库对应多个应用的数据一致性(技术上存在可能,但从上述概念上看应该是在架构上避免的)。
这四个状况如何处理呢?须要咱们总结概括,我在作总结概括的时候,每每但愿首先肯定原则,这里的原则是从业务的角度进行分析,而不是考虑技术的可能性,由于技术的可能性无穷无尽,是一个无限组合,理论上任何状况都能发生,考虑全部状况就是胡扯了,必须根据业务的特征进行概括。这里,我不叫分布式事务而是数据一致性就是这个道理,从业务角度目标是解决分布式状况下的数据一致性,而不是技术角度看的分布式事务。
有了这个原则,就能够分别分析这四种状况了:
前端
一、系统间的数据一致性数据库
须要服务实现 TCC或者业务补偿模式,由框架(业务协调器)自动调用,减小人工参与,或者实现幂等服务,反复投递。这两种方式都无法作到数据的 100% 一致,在失败的时候都须要有重试的机制,例如补偿失败要重试(这就是框架的好处),屡次重试仍是失败,记录失败历史,业务上人工处理。不要惧怕人工处理,只要减小人工处理的机会就行了,在工行时就是提出人工干预比例下降若干个百分点做为目标。
后端
二、系统内应用间的数据一致性架构
这个可使用华为 SAGA 的模式,也就是创建一个共享的事务协调器模式(虽然我对这个共享方式不喜欢,不是分布式吗,为啥还搞出一堆集中式的东西,既然如此,为啥应用间调用不能走网关,要直连,说共享很差,到这里就是共享好了),好了,括号里是吐槽,简单的方式是用共享的事务协调器模式,记录服务调用的事件,在合适的时机调用TCC和补偿服务。
三、应用内部对应多数据库的数据一致性,是个反模式,不要作通用方案并发
通常来讲,一个应用对应一个数据库,不容许一个应用对应多个数据库,多个数据库的状况应该分红多个应用,经过服务调用方式解决,这是一个基本原则,不然就是一个反模式设计。可是,就是有不少人较真,必定问有这个状况你怎么解决,个人回答是架构设计解决这个问题,在技术上不支持这种方式,让设计者必须在架构解决,而不是利用技术手段解决不合理的架构设计,不然后患无穷(这一点仍是须要勇气和坚持的)。空口无凭,实例为证,通常我会举抢红包的例子。你们知道,抢红包的并发很是高,又有数据一致性的要求,不管哪一个互联网公司,都是根据红包 ID,把数据路由到一个数据库中,用数据库事务保证数据一致性,在银行互联网帐务系统(2类 3类户)的状况,也是把同一帐务的数据路由到不一样的数据库中(见下图)。还会提到一种状况,在分库分表的时候,若是刚好数据分到了不一样库中,刚好要作一个批量的调整,刚好在一个事务中,如何解决。我认为这种状况的发生,偏偏说明设计有问题,分库的原则也是按业务拆分,不是用技术手段随机分解,既然按业务拆分,批量处理的时候就应该不是一个业务上的事务,在技术上不提供这样的实现,才能够在架构设计考虑问题。不排除在某个系统中能够作一些框架,解决上述问题,可是,这必定不是个通用的方案。框架
根据上图,咱们的概念模型是由调整的,要多一个应用分区的状况:
四、一个数据库对应多个应用的数据一致性前后端分离
这种状况常常也是一个反模式,既然是共享一个数据库,把应用放在一块儿就行了。若是真的有须要(例如一个模块部署过于频繁,单独拆出来作一个应用),那也应该和多应用多数据库同样处理。分布式
以上,便是我分析的分布式架构下几种不一样状况的数据一致性控制方式。微服务
关于做者:焦烈焱,普元信息CTO,致力于技术创新和金融创新解决方案研究。专一于企业技术架构领域,对分布式环境的企业计算、 企业信息架构的规划与实践有着丰厚经验,带领普元技术团队相继在云计算、大数据及移动开发领域取得多项突破,并主持中国工商银行、中国建设银行等多家大型企业技术平台的规划与研发。大数据
关于EAWorld:微服务,DevOps,数据治理,移动架构原创技术分享。长按二维码关注!