这部分布式事务开山之作,凭啥第一天预售就拿下当当新书榜No.1?
大家好,我是冰河~~
今天,咱们就暂时不聊【精通高并发系列】了,今天插播一下分布式事务,为啥?因为冰河联合猫大人共同创作的分布式事务领域的开山之作——《深入理解分布式事务:原理与实战》一书正式出版了,于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?的更多相关文章
- MySQL binlog 组提交与 XA(分布式事务、两阶段提交)【转】
概念: XA(分布式事务)规范主要定义了(全局)事务管理器(TM: Transaction Manager)和(局部)资源管理器(RM: Resource Manager)之间的接口.XA为了实现分布 ...
- 关于分布式事务、两阶段提交、一阶段提交、Best Efforts 1PC模式和事务补偿机制的研究 转载
1.XA XA是由X/Open组织提出的分布式事务的规范.XA规范主要定义了(全局)事务管理器(Transaction Manager)和(局部)资源管理器(Resource Manager)之间的接 ...
- spring3.0+Atomikos 构建jta的分布式事务 -- NO
摘自: http://gongjiayun.iteye.com/blog/1570111 spring3.0+Atomikos 构建jta的分布式事务 spring3.0已经不再支持jtom了,不过我 ...
- 谈谈分布式事务之三: System.Transactions事务详解[下篇]
在前面一篇给出的Transaction的定义中,信息的读者应该看到了一个叫做DepedentClone的方法.该方法对用于创建基于现有Transaction对 象的“依赖事务(DependentTra ...
- 谈谈分布式事务之三: System.Transactions事务详解[上篇]
在.NET 1.x中,我们基本是通过ADO.NET实现对不同数据库访问的事务..NET 2.0为了带来了全新的事务编程模式,由于所有事务组件或者类型均定义在System.Transactions程序集 ...
- 谈谈分布式事务之二:基于DTC的分布式事务管理模型[下篇]
[续上篇] 当基于LTM或者KTM的事务提升到基于DTC的分布式事务后,DTC成为了本机所有事务型资源管理器的管理者:此外,当一个事务型操作超出了本机的范 围,出现了跨机器的调用后,本机的DTC需要于 ...
- 分布式事务、XA、两阶段提交、一阶段提交
本文原文连接:http://blog.csdn.net/bluishglc/article/details/7612811 ,转载请注明出处! 1.XA XA是由X/Open组织提出的分布式事务的规范 ...
- 分布式事务实现-Spanner
Spanner要满足的external consistency 是指:后开始的事务一定可以看到先提交的事务的修改.所有事务的读写都加锁可以解决这个问题,缺点是性能较差.特别是对于一些workload中 ...
- 分布式事务的典型处理方式:2PC、TCC、异步确保和最大努力型
1. 柔性事务和刚性事务 柔性事务满足BASE理论(基本可用,最终一致)刚性事务满足ACID理论 本文主要围绕分布式事务当中的柔性事务的处理方式进行讨论. 柔性事务分为 两阶段型 补偿型 异步确保型 ...
随机推荐
- 基本ServletWEB项目
项目搭建 项目链接https://gitee.com/zhangjzm/smbms.git 前置知识,Servlet JSP 结构图 搭建maven web项目 1.搭建一个maven web项目 2 ...
- 使用dubbo-go搭建dubbo接口测试平台
背景 http接口测试只需要一个curl命令,但dubbo协议没有这样的现成接口测试工具.通常公司内的dubbo控制台或其他平台会集成一个dubbo接口测试工具. 调用一个dubbo接口,需要知道服务 ...
- @RequestParam、@RequestBody、@PathVariable区别和案例分析
一.前言 @RequestParam.@RequestBody.@PathVariable都是用于在Controller层接收前端传递的数据,他们之间的使用场景不太一样,今天来介绍一下!! 二.实体类 ...
- CommonsCollections3 反序列化利用链分析
InstantiateTransformer commons-collections 3.1 中有 InstantiateTransformer 这么一个类,这个类也实现了 Transformer的t ...
- SpringMVC执行流程总结
SpringMVC 执行流程: 用户发送请求至前端控制器 DispatcherServlet DispatcherServlet 收到请求调用处理映射器 HandlerMapping 处理映射器根据请 ...
- CodeForce-799B T-shirt buying (STL_set)
有 n 件T恤.第 i 件T恤的价格为 pi .每个T恤有两面,第 i 件T恤正面颜色为 ai ,反面颜色为 bi . 有 m 个人想买T恤,每个人都恰好买一件.第 j 个人最喜欢颜色 cj. 一个人 ...
- Artix Linux作业系统的使用~
Artix(阿蒂克斯)Linux 与Gentoo(贱兔) Linux真是夫唱妇随.由于Artix(阿蒂克斯)逃离Systemd,投入到了openrc温暖的怀抱,从而使得每安装一个软体,你还得额外为其安 ...
- Docker系列(16)- 容器数据卷
什么是容器数据卷 docker的理念回顾 将应用和环境打包成一个镜像 数据?如果数据都在容器中,那么我们容器删除,数据就会丢失!新增一个需求:数据可以持久化 MySQL,容器删了等于删库跑路!新增一个 ...
- jmeter长时间压测
如何进行24h小时的压测? 长时间压测注意事项 生成报告文件过大 https://www.cnblogs.com/SunshineKimi/p/12298668.html
- modern php enable zend opcache
字节码缓存能存储预先编译好的php代码 * 如果是自己编译PHP ./configure --enable-opcache 编译好后 php.ini zend_extension=opcache.so ...