分布式架构中数据一致性常见的几个问题(云时代架构文章读后感16)

针对分布式架构下的数据一致性,大家也许会问这样的问题:跨系统间分布式事务如何解决?系统内多个服务的分布式事务如何解决?一个服务内多个数据源/数据库的分布式事务如何解决?……这些问题大家是很容易理解的,但是由于术语不准确,所以解释起来会有二义性,所以先要统一语言或者术语,也就是统一概念:

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

传统的单体应用,指的就是系统,在微服务架构下,单体应用采用前后端分离模式,前端一般使用 Nginx,Ngnix 进程间采用主备模式,系统的后端可以分为多个应用,每个应用有一组对等的应用进程(也称为应用实例)提供服务,每个应用对应一个数据库,实际上在分库的情况下,有可能一个应用对应多个数据库。复杂一点的是网关,网关由一组对等的网关实例组成,如果多个系统共享一个网关,网关和系统就是1对多的关系,也可以一个系统独享一个网关,就是一对一情况,下图是一个概念的示例,使用的是系统独享网关模式。

我们看看经常问的一些问题:跨系统间分布式事务、系统内多个服务的分布式事务、一个服务内多个数据源/数据库的分布式事务,这些问题完全是从技术的角度做归纳,用上述概念应该改为:系统间的数据一致性、系统内应用间的数据一致性、应用内部对应多数据库的数据一致性,另外可以增加一个数据库对应多个应用的数据一致性(技术上存在可能,但从上述概念上看应该是在架构上避免的)。

1、系统间的数据一致性

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

2、系统内应用间的数据一致性

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

3、应用内部对应多数据库的数据一致性,是个反模式,不要做通用方案

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

4、一个数据库对应多个应用的数据一致性

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

原文地址:https://www.cnblogs.com/chch157/p/11050726.html

时间: 2024-11-06 10:02:34

分布式架构中数据一致性常见的几个问题(云时代架构文章读后感16)的相关文章

分布式架构中数据一致性常见的几个问题

针对分布式架构下的数据一致性,大家也许会问这样的问题:跨系统间分布式事务如何解决?系统内多个服务的分布式事务如何解决?一个服务内多个数据源/数据库的分布式事务如何解决?……这些问题大家是很容易理解的,但是由于术语不准确,所以解释起来会有二义性,所以先要统一语言或者术语,也就是统一概念: 域是一个虚拟的分类,几个系统属于某一个域,例如网上银行和手机银行都属于电子渠道领域: 传统的单体应用,指的就是系统,在微服务架构下,单体应用采用前后端分离模式,前端一般使用 Nginx,Ngnix 进程间采用主备

分布式架构理解(云时代架构文章读后感10)

随着移动互联网的发展智能终端的普及,计算机系统早就从单机独立工作过渡到多机器协作工作.计算机以集群的方式存在,按照分布式理论的指导构建出庞大复杂的应用服务,也已经深入人心.本文力求从分布式基础理论,架构设计模式,工程应用,部署运维,业界方案这几大方面,介绍基于MSA(微服务架构)的分布式的知识体系大纲.从而对SOA到MSA进化有个立体的认识,从概念上和工具应用上更近一步了解微服务分布式的本质,身临其境的感受如何搭建全套微服务架构的过程. SOA面向服务架构 由于业务发展到一定层度后,需要对服务进

Java集合类List解读(在云时代架构中读到了)

在Java学习中我们会频繁用到Java集合类,相较于数组(Array)来说,集合类的长度可变,比数组来说要灵活,更适合我们的开发学习.Java集合就像个容器可以存储任何类型的数据,也可以结合泛型来存储具体的类型对象.使用集合类一般都需要引用java.util包. 通过阅读文章我发现了我一直在用的Java集合由两大体系构成,分别是Collection体系和Map体系,其中Collection和Map分别是2大体系中的顶层接口.Collection主要有三个子接口,分别为List(列表).Set(集

云时代架构之豆瓣的基础架构读后感

阅读了豆瓣的基础架构,接触了很多新名词,有很多都是没有接触过甚至是没有听过的,说明离就业要求还差着很多,以下是阅读这篇文章我学到的东西: 豆瓣整个基础架构可以粗略的分为在线和离线两大块.在线的部分和大部分网站类似:前面用LVS做HA,用Nginx做反向代理,形成负载均衡的一 层:应用层主要是做运算,将运算结果返回给前面的用户,DAE平台是这两年建起来的,现在大部分豆瓣的应用基本都跑在DAE上面了:应用后面的基础服务也 跟其他网站差不多,MySQL.memcached.redis.beanstal

云时代架构读后感(三)

阿里游戏高可用架构设计实践 原文地址:https://mp.weixin.qq.com/s?__biz=MzA4Nzg5Nzc5OA==&mid=2651660980&idx=1&sn=640c3d2280d7657f236434ff6ba0b22b&scene=21#wechat_redirect 这篇文章文章主要是对游戏架构的设计,因为作为一名游戏玩家,都是非常注重游戏体验的,如果在游戏过程中出现不能登录,或者掉线的情况,很多人可能会投诉.初始可能人们都会认为是运维的原

关于技术规划、管理、架构的思考(云时代架构文章读后感15)

一.关于技术规划 技术规划规划做得好,能起到比较好的正向引导作用,个人及团队的整体目标感会好很多,分为三个部分的内容: 第一部分是全局分析,这需要溯源历史,思考未来,要对未来有一定的预判.能够基于数据,基于专业,基于客户价值,同时结合顶层的战略.公司的战役情况和组织的现状做分析. 第二部分是定目标.这一部分非常关键,定义好目标以及非目标,哪些事情是不要做的也要讲明白,并且确认目标的实现路径,做好拆解. 最后一部分是以终为始,从最终结果的角度,来溯源开始.从技术支撑业务发展.平台能力输出或者赋能.

互联网高新吗(云时代架构文章读后感14)

原因: 1.12-16年,4G网络大基建,从京沪广深杭,到我家湖南边远贫困村,大干快上,全国范围铺开.运营商主导,网络设备商,芯片商,终端厂商跟进. 2.4G手机大普及.千元以下智能机功不可没,大浪淘沙,小米.华为.OPPO,vivo最终胜出. 3.因为1.2,网民倍增,流量倍增 (10倍,不夸张吧,微信10亿月活跃用户).以前上网需要一台电脑,受制于时间.地点,现在一部手机随时随地,终端数量和上网时间两重倍增,这种机会几十年不遇. 4.移动互联网爆发期,叠加历史性的货币大宽松周期,热钱汹涌,万

分布式服务框架 Zookeeper -- 管理分布式环境中的数据

安装和配置详解 Zookeeper 分布式服务框架是 Apache Hadoop 的一个子项目,它主要是用来解决分布式应用中经常遇到的一些数据管理问题,如:统一命名服务.状态同步服务.集群管理.分布式应用配置项的管理等.本文将 从使用者角度详细介绍 Zookeeper 的安装和配置文件中各个配置项的意义,以及分析 Zookeeper 的典型的应用场景(配置文件的管理.集群管理.同步锁.Leader 选举.队列管理等),用 Java 实现它们并给出示例代码. 单机模式 单 机安装非常简单,只要获取

【转】分布式服务框架 Zookeeper -- 管理分布式环境中的数据

Zookeeper 分布式服务框架是 Apache Hadoop 的一个子项目,它主要是用来解决分布式应用中经常遇到的一些数据管理问题,如:统一命名服务.状态同步服务.集群管理.分布式应用配置项的管理等.本文将从使用者角度详细介绍 Zookeeper 的安装和配置文件中各个配置项的意义,以及分析 Zookeeper 的典型的应用场景(配置文件的管理.集群管理.同步锁.Leader 选举.队列管理等),用 Java 实现它们并给出示例代码. 安装和配置详解 本文介绍的 Zookeeper 是以 3