分布式架构数据常见问题阅读总结

摘要:
让我们来看看一些常见问题:跨系统的分布式事务、跨系统内多个服务的分布式事务,以及跨服务内多个数据源/数据库的分布式事务。这些问题是从技术角度完全总结出来的。上述概念应改为:系统之间的数据一致性、系统内应用程序之间的数据连贯性、应用程序内多个数据库之间的数据协调性。

域是一个虚拟的分类,几个系统属于某一个域,例如网上银行和手机银行都属于电子渠道领域;

传统的单体应用,指的就是系统,在微服务架构下,单体应用采用前后端分离模式,前端一般使用 Nginx,Ngnix 进程间采用主备模式,系统的后端可以分为多个应用,每个应用有一组对等的应用进程(也称为应用实例)提供服务,每个应用对应一个数据库,实际上在分库的情况下,有可能一个应用对应多个数据库。复杂一点的是网关,网关由一组对等的网关实例组成,如果多个系统共享一个网关,网关和系统就是1对多的关系,也可以一个系统独享一个网关,就是一对一情况,下图是一个概念的示例,使用的是系统独享网关模式。我们看看经常问的一些问题:跨系统间分布式事务、系统内多个服务的分布式事务、一个服务内多个数据源/数据库的分布式事务,这些问题完全是从技术的角度做归纳,用上述概念应该改为:系统间的数据一致性、系统内应用间的数据一致性、应用内部对应多数据库的数据一致性,另外可以增加一个数据库对应多个应用的数据一致性。这四个情况需要我们总结归纳,在总结归纳的时候要首先确定原则,从业务的角度上进行分析,而不是考虑技术的可能性,因为技术的可能性无穷无尽,是一个无限组合,理论上任何情况都能发生,必须根据业务的特征进行归纳,确定了这个原则,我们就可以分别分析这四种情况了:

1、系统间的数据一致性。需要服务实现 TCC或者业务补偿模式,由框架(业务协调器)自动调用,减少人工参与,或者实现幂等服务,反复投递。这两种方式都没法做到数据的 100% 一致,在失败的时候都需要有重试的机制,例如补偿失败要重试(这就是框架的好处),多次重试还是失败,记录失败历史,业务上人工处理。不要害怕人工处理,只要减少人工处理的机会就好了,在工行时就是提出人工干预比例降低若干个百分点作为目标。

2、系统内应用间的数据一致性。这个可以使用华为 SAGA 的模式,也就是建立一个共享的事务协调器模式(虽然我对这个共享方式不喜欢,不是分布式吗,为啥还搞出一堆集中式的东西,既然如此,为啥应用间调用不能走网关,要直连,说共享不好,到这里就是共享好了),好了,括号里是吐槽,简单的方式是用共享的事务协调器模式,记录服务调用的事件,在合适的时机调用TCC和补偿服务。

3、应用内部对应多数据库的数据一致性,是个反模式,不要做通用方案。一般来说,一个应用对应一个数据库,不允许一个应用对应多个数据库,多个数据库的情况应该分成多个应用,通过服务调用方式解决,这是一个基本原则,否则就是一个反模式设计。但是,就是有很多人较真,一定问有这个情况你怎么解决,我的回答是架构设计解决这个问题,在技术上不支持这种方式,让设计者必须在架构解决,而不是利用技术手段解决不合理的架构设计,否则后患无穷(这一点还是需要勇气和坚持的)。空口无凭,实例为证,一般我会举抢红包的例子。大家知道,抢红包的并发非常高,又有数据一致性的要求,无论哪个互联网公司,都是根据红包 ID,把数据路由到一个数据库中,用数据库事务保证数据一致性,在银行互联网账务系统(2类 3类户)的情况,也是把同一账务的数据路由到不同的数据库中(见下图)。还会提到一种情况,在分库分表的时候,如果恰好数据分到了不同库中,恰好要做一个批量的调整,恰好在一个事务中,如何解决。我认为这种情况的发生,恰恰说明设计有问题,分库的原则也是按业务拆分,不是用技术手段随机分解,既然按业务拆分,批量处理的时候就应该不是一个业务上的事务,在技术上不提供这样的实现,才可以在架构设计考虑问题。不排除在某个系统中可以做一些框架,解决上述问题,但是,这一定不是个通用的方案。

4、一个数据库对应多个应用的数据一致性。这种情况经常也是一个反模式,既然是共享一个数据库,把应用放在一起就好了。如果真的有需要(例如一个模块部署过于频繁,单独拆出来做一个应用),那也应该和多应用多数据库一样处理。

 

免责声明:文章转载自《分布式架构数据常见问题阅读总结》仅用于学习参考。如对内容有疑问,请及时联系本站处理。

上篇django-实现登录短信验证QT5:网络下篇

宿迁高防,2C2G15M,22元/月;香港BGP,2C5G5M,25元/月 雨云优惠码:MjYwNzM=

相关文章

数据持久化之sqlite基本用法

一、ACID 即原子性(Atomicity)、一致性(Consistency)、隔离性(Isolation)、持久性(Durability)。 原子性:整个事务中的所有操作,要么全部完成,要么全部不完成,不可能停滞在中间某个环节。 一致性:事务在完成时,必须使所有的数据都保持一致状态。 隔离性:隔离状态执行事务,使它们好像是系统在给定时间内执行的唯一操作。...

搜索和浏览离线 Wikipedia 维基百科(中/英)数据工具

  为什么使用离线维基百科?一是因为最近英文维基百科被封,无法访问;二是不受网络限制,使用方便,缺点是不能及时更新,可能会有不影响阅读的乱码。   目前,主要有两种工具用来搜索和浏览离线维基百科数据:Kiwix 和 WikiTaxi 。这两种都是免费的,但 WikiTaxi 只有 Windows 版本,而 Kiwix 不仅支持 Windows、Linux...

『软件介绍』SQLServer2008 基本操作

0x 01 连接数据库     Win7下,先打开SQLServer管理工具(开始菜单/所有程序/Microsoft SQL Server 2008/SQL Server Management Studio)     会弹出“连接到服务器对话框” 1 服务器类型 : 数据库引擎 2 服务器名称 : 127.0.0.1 3 身份验证 : Windows身...

如何更改SQL Server2008默认数据库的存储路径

1.安装SQl Server过程中,修改路径(因为我安装的时候,忘记改路径了,所以没截下图来,黄色部分是真正的标注): 当然了,也可以修改共享功能目录 以及修改实例根目录 不过,我也不知道共享功能目录,实例根目录装的啥。 2.打开SQL Server2008,在图形界面里修改数据库的存储路径:  右击“对象资源管理器”,然后单击“属性”,在单击“数...

JS 获取web sql 数据

var tbName="tableName"; var tdName=["id","th1","th2","th3"]; var strSQL="select * from "+tbName+" where id="+1; //从web sql数据库获取数据; function getWebSqlData(strSQL,tbName,tdName){...

关于Javaweb的比较好用的jar包概述

(连接数据库之前首先要导入这个数据库的驱动jar包 例如mysql 为mysql-connector-java-5.1.46.jar) 关于连接数据库的数据库连接池c3p0  jar包: c3p0-0.9.5-pre1.jar相关依赖有mchange-commons-java-0.2.4.jar    itcast-tools-1.4.jar(这个里面有一...