大家好,我是冰河~~

今天,咱们就暂时不聊【精通高并发系列】了,今天插播一下分布式事务,为啥?因为冰河联合猫大人共同创作的分布式事务领域的开山之作——《深入理解分布式事务:原理与实战》一书正式出版了,于2021年10月20日开始在当当预售,当天即登上当当新书榜第一的位置!

划重点:当当10.20~10.24限时5折优惠!!打开当当首页,搜索:分布式事务,找到5折优惠商品链接,点击加购,下单即可。

为了让小伙伴们更好的了解这本书的内容,我们就简单的聊聊书中关于分布式系统架构和分布式事务产生的场景吧。好了,我们开始今天的正文吧。

前言

随着互联网的不断发展,企业积累的数据越来越多。当单台数据库难以存储海量数据时,人们便开始探索如何将这些数据分散地存储到多台服务器的多台数据库中,逐渐形成了分布式数据库。如果将数据分散存储,对于数据的增删改查操作就会变得更加复杂,尤其是难以保证数据的一致性问题,这就涉及了常说的分布式事务。

本文对分布式事务的基本概念进行介绍,涉及的内容如下。

  • 分布式系统架构原则。

  • 分布式系统架构演进。

  • 分布式事务场景。

分布式系统架构

随着互联网的快速发展,传统的单体系统架构已不能满足海量用户的需求。于是,更多的互联网企业开始对原有系统进行改造和升级,将用户产生的大规模流量进行分解,分而治之,在不同的服务器上为用户提供服务,以满足用户的需求。慢慢地,由原来的单体系统架构演变为 分布式系统架构

1.产生的背景

在互联网早期,互联网企业的业务并不是很复杂,用户量也不大,一般使用单体系统架构快速实现业务。此时,系统处理的流量入口更多来自PC端。

随着用户量爆发式增长,此时的流量入口不再只有PC端,更多来自移动端App、H5、微信小程序、自主终端机、各种物联网设备和网络爬虫等。用户和企业的需求也开始变得越来越复杂。在不断迭代升级的过程中,单体系统变得越来越臃肿,系统的业务也变得越来越复杂,甚至难以维护。修改一个很小的功能可能会导致整个系统的变动,并且系统需要经过严格测试才能上线,一个很小的功能就要发布整个系统,直接影响了系统中其他业务的稳定性与可用性。

此时开发效率低下,升级和维护系统成本很高,测试周期越来越长,代码的冲突率也会变得越来越高。最让人头疼的是,一旦有开发人员离职,新入职的人需要很长的时间来熟悉整个系统。单体系统架构已经无法支撑大流量和高并发的场景。

面对单体系统架构的种种问题,解决方案是对复杂、臃肿的系统进行水平拆分,把共用的业务封装成独立的服务,供其他业务调用,把各相关业务封装成子系统并提供接口,供其他系统或外界调用,以此达到降低代码耦合度,提高代码复用率的目的。

此时,由于各个子系统之间进行了解耦,因此对每个子系统内部的修改不会影响其他子系统的稳定性。这样一来降低了系统的维护和发布成本,测试时也不需要把整个系统再重新测试一遍,提高了测试效率。在代码维护上,各个子系统的代码单独管理,降低了代码的冲突率,提高了系统的研发效率。

2.架构目标和架构原则

好的分布式系统架构并不是一蹴而就的,而是随着企业和用户的需求不断迭代演进的,能够解决分布式系统当前最主要的矛盾,同时对未来做出基本的预测,使得系统架构具备高并发、高可用、高可扩展性、高可维护性等非功能性需求,能够快速迭代,以适应不断变化的需求。

分布式系统架构的设计虽然比较复杂,但是也有一些业界遵循的原则。其中一些典型的架构原则来自The Art of Scalability一书,作者马丁L.阿伯特和迈克尔T.费舍尔分别是eBay和PayPal的CTO。他们在书中总结了15项架构原则,分别如下所示。

  • N + 1设计。
  • 回滚设计。
  • 禁用设计。
  • 监控设计。
  • 设计多活数据中心。
  • 使用成熟的技术。
  • 异步设计。
  • 无状态系统。
  • 水平扩展而非垂直升级。
  • 设计时至少要有两步前瞻性。
  • 非核心则购买。
  • 使用商品化硬件。
  • 小构建、小发布和快试错。
  • 隔离故障。
  • 自动化。

分布式系统架构演进

互联网企业的业务飞速发展,促使系统架构不断变化。总体来说,系统架构大致经历了单体应用架构垂直应用架构分布式架构SOA架构微服务架构的演变,很多互联网企业的系统架构已经向服务化网格(Service Mesh)演变。接下来简单介绍一下系统架构的发展历程。

1.单体应用架构

在企业发展的初期,一般公司的网站流量比较小,只需要一个应用将所有的功能代码打包成一个服务并部署到服务器上,就能支撑公司的业务需求。这种方式能够减少开发、部署和维护的成本。

比如大家很熟悉的电商系统,里面涉及的业务主要有用户管理、商品管理、订单管理、支付管理、库存管理、物流管理等模块。企业发展初期,我们将所有的模块写到一个Web项目中,再统一部署到一个Web服务器中,这就是 单体应用架构 ,系统架构如下图所示。

这种架构的 优点 如下。

1)架构简单,项目开发和维护成本低。

2)所有项目模块部署在一起,对于小型项目来说,方便维护。

但是,其 缺点 也是比较明显的。

1)所有模块耦合在一起,对于大型项目来说,不易开发和维护。

2)项目各模块之间过于耦合,一旦有模块出现问题,整个项目将不可用。

3)无法针对某个具体模块来提升性能。

4)无法对项目进行水平扩展。

正是由于单体应用架构存在诸多缺点,才逐渐演变为垂直应用架构。

2.垂直应用架构

随着企业业务的不断发展,单节点的单体应用无法满足业务需求。于是,企业将单体应用部署多份,分别放在不同的服务器上。然而,不是所有的模块都有比较大的访问量。如果想针对项目中的某些模块进行优化和性能提升,对于单体应用来说,是做不到的。于是,垂直应用架构诞生了。

垂直应用架构 就是将原来的项目应用拆分为互不相干的几个应用,以此提升系统的整体性能。

同样以电商系统为例,在垂直应用架构下,我们可以将整个电商项目拆分为电商交易系统、后台管理系统、数据分析系统,系统架构如下图所示。

将单体应用架构拆分为垂直应用架构之后,一旦访问量变大,只需要针对访问量大的业务增加服务器节点,无须针对整个项目增加服务器节点。

这种架构的 优点 如下。

1)对系统进行拆分,可根据不同系统的访问情况,有针对性地进行优化。

2)能够实现应用的水平扩展。

3)各系统能够分担整体访问流量,解决了并发问题。

4)子系统发生故障,不影响其他子系统的运行情况,提高了整体的容错率。

这种架构的 缺点 如下。

1)拆分后的各系统之间相对独立,无法进行互相调用。

2)各系统难免存在重叠的业务,会存在重复开发的业务,后期维护比较困难。

3.分布式架构

将系统演变为垂直应用架构之后,当垂直应用越来越多时,重复编写的业务代码就会越来越多。此时,我们需要将重复的代码抽象出来,形成统一的服务,供其他系统或者业务模块调用,这就是 分布式架构

在分布式架构中,我们会将系统整体拆分为服务层和表现层。服务层封装了具体的业务逻辑供表现层调用,表现层则负责处理与页面的交互操作。分布式系统架构如下图所示。

这种架构的 优点 如下。

1)将重复的业务代码抽象出来,形成公共的访问服务,提高了代码的复用性。

2)可以有针对性地对系统和服务进行性能优化,以提升整体的访问性能。

这种架构的 缺点 如下。

1)系统之间的调用关系变得复杂。

2)系统之间的依赖关系变得复杂。

3)系统维护成本高。

4.SOA架构

在分布式架构下,当部署的服务越来越多时,重复的代码就会变得越来越多,不利于代码的复用和系统维护。为此,我们需要增加一个统一的调度中心对集群进行实时管理,这就是SOA(面向服务)架构。SOA系统架构如下图所示。

这种架构的 优点 是通过注册中心解决了各个服务之间服务依赖和调用关系的自动注册与发现。

这种架构的 缺点 如下。

1)各服务之间存在依赖关系,如果某个服务出现故障,可能会造成服务器崩溃。

2)服务之间的依赖与调用关系复杂,增加了测试和运维的成本。

5.微服务架构

微服务架构 是在SOA架构的基础上进行进一步的扩展和拆分。在微服务架构下,一个大的项目拆分为一个个小的可独立部署的微服务,每个微服务都有自己的数据库。微服务系统架构如下图所示。

这种架构的 优点 如下。

1)服务彻底拆分,各服务独立打包、独立部署和独立升级。

2)每个微服务负责的业务比较清晰,利于后期扩展和维护。

3)微服务之间可以采用REST和RPC协议进行通信。

这种架构的 缺点 如下。

1)开发成本比较高。

2)涉及各服务的容错性问题。

3)涉及数据的一致性问题。

4)涉及分布式事务问题。

分布式事务场景

将一个大的应用系统拆分为多个可以独立部署的应用服务,需要各个服务远程协作才能完成某些事务操作,这就涉及分布式事务的问题。总的来讲,分布式事务会在3种场景下产生,分别是跨JVM进程、跨数据库实例和多服务访问单数据库。

1.跨JVM进程

将单体项目拆分为分布式、微服务项目之后,各个服务之间通过远程REST或者RPC调用来协同完成业务操作。典型的场景是商城系统的订单微服务和库存微服务,用户在下单时会访问订单微服务。

订单微服务在生成订单记录时,会调用库存微服务来扣减库存。各个微服务部署在不同的JVM进程中,此时会产生因跨JVM进程而导致的分布式事务问题。商城系统中跨JVM进程产生分布式事务的场景如下图所示。

2.跨数据库实例

单体系统访问多个数据库实例,也就是跨数据源访问时会产生分布式事务。例如,系统中的订单数据库和交易数据库放在不同的数据库实例中,当用户发起退款时,会同时操作用户的订单数据库和交易数据库(在交易数据库中执行退款操作,在订单数据库中将订单的状态变更为已退款)。

由于数据分布在不同的数据库实例中,需要通过不同的数据库连接会话来操作数据库中的数据,因此产生了分布式事务。商城系统中跨数据库实例产生分布式事务场景如下图所示。

3.多服务访问单数据库

多个微服务访问同一个数据库,例如,订单微服务和交易微服务访问同一个数据库就会产生分布式事务,原因是多个微服务访问同一个数据库,本质上也是通过不同的数据库会话来操作数据库,此时就会产生分布式事务。商城系统中多服务访问单数据库产生分布式事务的场景如下图所示。

跨数据库实例场景和多服务访问单数据库场景,在本质上都会产生不同的数据库会话来操作数据库中的数据,进而产生分布式事务。这两种场景是比较容易被忽略的。

写在最后

为了让小伙伴们更好的了解本书,在文章最后冰河附上几张精美的图片。

哈哈,喜欢的小伙伴当当下单即可,有啥问题可以私信冰河咨询,冰河看到后都会一一解答。

好了,今天就到这儿吧,我是冰河,我们下期见~~

这部分布式事务开山之作,凭啥第一天预售就拿下当当新书榜No.1?的更多相关文章

  1. MySQL binlog 组提交与 XA(分布式事务、两阶段提交)【转】

    概念: XA(分布式事务)规范主要定义了(全局)事务管理器(TM: Transaction Manager)和(局部)资源管理器(RM: Resource Manager)之间的接口.XA为了实现分布 ...

  2. 关于分布式事务、两阶段提交、一阶段提交、Best Efforts 1PC模式和事务补偿机制的研究 转载

    1.XA XA是由X/Open组织提出的分布式事务的规范.XA规范主要定义了(全局)事务管理器(Transaction Manager)和(局部)资源管理器(Resource Manager)之间的接 ...

  3. spring3.0+Atomikos 构建jta的分布式事务 -- NO

    摘自: http://gongjiayun.iteye.com/blog/1570111 spring3.0+Atomikos 构建jta的分布式事务 spring3.0已经不再支持jtom了,不过我 ...

  4. 谈谈分布式事务之三: System.Transactions事务详解[下篇]

    在前面一篇给出的Transaction的定义中,信息的读者应该看到了一个叫做DepedentClone的方法.该方法对用于创建基于现有Transaction对 象的“依赖事务(DependentTra ...

  5. 谈谈分布式事务之三: System.Transactions事务详解[上篇]

    在.NET 1.x中,我们基本是通过ADO.NET实现对不同数据库访问的事务..NET 2.0为了带来了全新的事务编程模式,由于所有事务组件或者类型均定义在System.Transactions程序集 ...

  6. 谈谈分布式事务之二:基于DTC的分布式事务管理模型[下篇]

    [续上篇] 当基于LTM或者KTM的事务提升到基于DTC的分布式事务后,DTC成为了本机所有事务型资源管理器的管理者:此外,当一个事务型操作超出了本机的范 围,出现了跨机器的调用后,本机的DTC需要于 ...

  7. 分布式事务、XA、两阶段提交、一阶段提交

    本文原文连接:http://blog.csdn.net/bluishglc/article/details/7612811 ,转载请注明出处! 1.XA XA是由X/Open组织提出的分布式事务的规范 ...

  8. 分布式事务实现-Spanner

    Spanner要满足的external consistency 是指:后开始的事务一定可以看到先提交的事务的修改.所有事务的读写都加锁可以解决这个问题,缺点是性能较差.特别是对于一些workload中 ...

  9. 分布式事务的典型处理方式:2PC、TCC、异步确保和最大努力型

    1. 柔性事务和刚性事务 柔性事务满足BASE理论(基本可用,最终一致)刚性事务满足ACID理论 本文主要围绕分布式事务当中的柔性事务的处理方式进行讨论. 柔性事务分为 两阶段型 补偿型 异步确保型 ...

随机推荐

  1. canal数据同步

    前面提到数据库缓存不一致的几种解决方案,但是在不同的场景下各有利弊,而今天我们使用的canal进行缓存与数据同步的方案是最好的,但是也有一个缺点,就是相对前面几种解决方案会引入阿里巴巴的canal组件 ...

  2. 20210808 Hunter,Defence,Connect

    考场 乍一看都不可做 T1 算了半天样例,一直算出来 \(\frac{81}{400}\),直接丢了 T1 推了推发现是求最长连续 \(0\) 的数量,那就是线段树合并加上<玫瑰花精> T ...

  3. Appium问题解决方案(2)- AttributeError:module 'appium.webdriver' has no attribute 'Remote'

    背景 运行脚本的时候,就直接报这个错误了,然后去看了下 appium.webdriver 库 结果发现啥都没有,就知道有问题了,然后一步步排查 步骤一 检查Appium-Python-Client 和 ...

  4. [原创]OpenEuler20.03安装配置PostgreSQL13.4详细图文版

    OpenEuler安装配置PostgreSQL 编写时间:2021年9月18日 作者:liupp 邮箱:liupp@88.com 序号 更新内容 更新日期 更新人 1 完成第一至三章内容编辑: 202 ...

  5. Shell系列(36)- for循环语法二简介及批量添加删除用户

    for循环语法二 for ((初始值;循环控制条件;变量变化)) do 程序 done 例子 例子-1 求和工具 需求:根据用户输入的数字,求1~输入所有数字的和 脚本: #!/bin/bash re ...

  6. Python+Pygame开发太空大战/飞机大战完整游戏项目(附源代码)

    项目名称:太空大战 开发环境:Python3.6.4 第三方库:Pygame1.9.6 代码编辑器:Sublime Text 先来看一下游戏画面吧!  游戏画面动态且丰富哦!   需求分析 利用Pyt ...

  7. Python如何连接Mysql及基本操作

    什么要做python连接mysql,一般是解决什么问题的 做自动化测试时候,注册了一个新用户,产生了多余的数据,下次同一个账号就无法注册了,这种情况怎么办呢?自动化测试都有数据准备和数据清理的操作,如 ...

  8. Python代码阅读(第8篇):列表元素逻辑判断

    Python 代码阅读合集介绍:为什么不推荐Python初学者直接看项目源码 本篇阅读的三份代码的功能分别是判断列表中的元素是否都符合给定的条件:判断列表中是否存在符合给定的条件的元素:以及判断列表中 ...

  9. 手动实现 shared_ptr

    面试写了一个基础的 scoped_ptr,被面试官要求写 shared_ptr,一时语塞.面试官不断提示我说在现有的基础上实现 shared_ptr 很简单,真的很简单,宛如在不断暗示我 1+1 就是 ...

  10. 关于mysql基础

    早就想把自己的数据库基础巩固一下,然而一直没有时间,今天终于抽出时间对mysql数据库基础进行了学习与扩展. mysql与其他数据库的区别 Sqlite: 开源免费,体积小,单文件,没有进程.磁盘读性 ...