当前位置: 首页 > 科技观察

终于有人把分布式系统架构讲明白了

时间:2023-03-18 21:25:04 科技观察

终于有人把分布式系统架构解释清楚了。转载本文请联系数据仓库宝贝图书馆公众号。随着互联网的不断发展,企业积累的数据越来越多。当单一数据库难以存储海量数据时,人们开始探索如何将这些数据存储在多台服务器上的多个数据库中,逐渐形成了分布式数据库。如果数据是分散存储的,对数据的增删改查操作会变得更加复杂,尤其是数据的一致性很难保证,这就涉及到我们常说的分布式事务。本文介绍了分布式事务的基本概念,涉及的内容如下。分布式系统架构原则。分布式系统架构的演变。分布式事务场景。1、分布式系统架构随着互联网的飞速发展,传统的单一系统架构已经不能满足大量用户的需求。于是,更多的互联网公司开始对原有系统进行改造升级,将用户产生的大规模流量进行分解,分而治之,在不同的服务器上为用户提供服务,以满足用户的需求。慢慢地,原来的单一系统架构演变成了分布式系统架构。一、背景在互联网初期,互联网公司的业务不是很复杂,用户数量也不多。一般采用单一的系统架构来快速实现业务。这时,系统处理的流量入口更多来自PC端。随着用户数量的爆发式增长,此时的流量入口不再仅仅来自PC端,更多的是来自手机APP、H5、微信小程序、独立终端、各种物联网设备、网络爬虫等。用户和企业的需求也开始变得越来越复杂。在不断迭代升级的过程中,单体系统变得越来越臃肿,系统的业务也越来越复杂,甚至难以维护。修改一个小功能可能会导致整个系统发生变化,系统需要经过严格的测试才能上线。一个小的功能需要整个系统的发布,直接影响到系统其他业务的稳定性和可用性。这时候开发效率低下,系统升级维护成本高,测试周期越来越长,代码冲突率也会越来越高。最麻烦的是一旦开发人员离开,新入职的人需要很长时间才能熟悉整个系统。单体系统架构已经无法支持大流量、高并发的场景。面对单体系统架构的种种问题,解决方案是将复杂臃肿的系统横向拆分,将通用业务封装成独立的服务供其他业务调用,将相关业务封装成子系统并提供接口。可以被其他系统或外界调用,降低代码耦合度,提高代码复用率。此时由于各个子系统解耦,各个子系统内部的修改不会影响其他子系统的稳定性。这样既降低了系统的维护和发布成本,又不需要在测试过程中对整个系统进行再次测试,提高了测试效率。在代码维护方面,将各个子系统的代码分开管理,降低了代码的冲突率,提高了系统的研发效率。2.架构目标和原则一个好的分布式系统架构不是一蹴而就的,而是随着企业和用户的需求迭代演进的,可以解决目前分布式系统的主要矛盾,同时对分布式系统的发展做出基本规划。futurePrediction使系统架构能够满足高并发、高可用、高扩展、高可维护性等非功能性需求,并能快速迭代以适应不断变化的需求。分布式系统架构的设计虽然比较复杂,但也有一些业界遵循的原则。其中一些典型的架构原则来自于分别是eBay和PayPal的首席技术官MartinL.Abbott和MichaelT.Fisher所著的《TheArtofScalability》一书。他们在书中总结了15条架构原则,如下所示。N+1设计。回滚设计。禁用设计。监控设计。设计一个多活动数据中心。使用成熟的技术。异步设计。无状态系统。水平扩展而不是垂直升级。设计至少向前迈出两步。买非核心。使用商用硬件。小型构建、小型发布和快速试错。隔离故障。自动化。2、分布式系统架构的演进互联网公司业务的快速发展促使系统架构不断发生变化。总的来说,系统架构大致经历了单体应用架构-垂直应用架构-分布式架构-SOA架构-微服务架构的演变。很多互联网公司的系统架构已经进化为服务网格(ServiceMesh)。下面简单介绍一下系统架构的开发过程。1.单体应用架构在企业发展初期,一般公司的网站流量都比较小,只需要一个应用将所有的功能代码打包成一个服务,部署在服务器上即可支撑公司的业务需求。这种方法降低了开发、部署和维护成本。比如大家熟悉的电子商务系统,主要包括用户管理、商品管理、订单管理、支付管理、库存管理、物流管理等模块。在企业开发初期,我们把所有的模块写成一个web项目,然后统一部署到一个web服务器上。这就是单体应用架构。系统架构如图1所示。图1 单体式应用系统架构该架构的优点如下。1)结构简单,项目开发维护成本低。2)所有项目模块一起部署,方便小项目维护。但是,它的缺点也比较明显。1)所有模块耦合在一起,不利于大型项目的开发和维护。2)项目的模块过于耦合。一旦某个模块出现问题,整个项目将不可用。3)无法针对特定模块提高性能。4)项目不能横向扩展。正是因为单体式应用架构的诸多缺点,才逐渐演变为垂直应用架构。2、垂直应用架构随着企业业务的不断发展,单节点单一应用已经不能满足业务需求。因此,企业会部署单个应用的多个副本,并将它们放在不同的服务器上。但是,并不是所有的模块都有比较大的访问量。如果想对项目中的某些模块进行优化和性能提升,对于单个应用来说是不可能的。于是,垂直应用架构诞生了。垂直应用架构是将原有的项目应用拆分成若干独立的应用,从而提高系统的整体性能。同样以电商系统为例,在垂直应用架构下,我们可以将整个电商项目拆分为电商交易系统、后台管理系统、数据分析系统。系统架构如图2所示。图2 垂直应用系统架构将单体应用架构拆分成垂直应用架构后,一旦访问量增加,只需要为大流量的业务增加服务器节点即可访问次数,而不是为整个项目添加服务器节点。这种架构的优点如下。1)对系统进行拆分,根据不同系统的接入情况,有针对性地进行优化。2)可以实现应用的水平扩展。3)各系统共享整体访问流量,解决并发问题。4)一个子系统的故障不影响其他子系统的运行,提高了整体的容错率。这种架构的缺点如下。1)拆分系统相对独立,不能相互调用。2)各个系统中难免会有重叠的服务,会出现服务的重复开发,增加后期维护的难度。3、分布式架构将系统演化为垂直应用架构后,当垂直应用越来越多时,重复编写的业务代码会越来越多。此时,我们需要将重复的代码抽象出来,形成一个统一的服务,供其他系统或业务模块调用。这就是分布式架构。在分布式架构中,我们将整个系统拆分为服务层和表现层。服务层封装了具体的业务逻辑供表现层调用,表现层负责处理与页面的交互。分布式系统架构如图3所示。图3 分布式系统架构该架构的优点如下。1)将重复的业务代码抽象出来,形成公共接入服务,提高了代码的复用性。2)可以有针对性地优化系统和服务的性能,提高整体访问性能。这种架构的缺点如下。1)系统之间的调用关系变得复杂。2)系统之间的依赖关系变得复杂。3)系统维护成本高。4、SOA架构在分布式架构下,当部署的服务越来越多时,重复代码也会越来越多,不利于代码复用和系统维护。为此,我们需要增加一个统一的调度中心来实时管理集群,这就是SOA(面向服务)架构。SOA系统架构如图4所示。图4?SOA系统架构这种架构的优点是通过注册中心解决了服务依赖和服务间调用关系的自动注册和发现。这种架构的缺点如下。1)服务之间存在依赖关系。如果某个服务出现故障,可能会导致服务器崩溃。2)服务之间的依赖和调用关系复杂,增加了测试和运维的成本。5、微服务架构微服务架构是在SOA架构的基础上进一步扩展和拆分的。在微服务架构下,一个大的项目被拆分成小的可独立部署的微服务,每个微服务都有自己的数据库。微服务系统架构如图5所示,这种架构的优点如下。1)服务完全拆分,每个服务独立打包、部署、升级。2)每个微服务负责的业务比较清晰,有利于后期的扩展和维护。3)REST和RPC协议可以用于微服务之间的通信。图5 微服务系统架构图这种架构的缺点如下。1)开发成本相对较高。2)涉及到各个服务的容错能力。3)涉及数据一致性问题。4)涉及分布式事务问题。3、分布式事务场景一个大型应用系统被拆分成多个可以独立部署的应用服务,需要各个服务远程协同完成某些事务操作,这就涉及到分布式事务的问题。一般来说,分布式事务会在三种场景下发生,即跨JVM进程、跨数据库实例、多服务访问单一数据库。1、将单个项目拆分成跨JVM进程的分布式、微服务项目后,各个服务可以通过远程REST或RPC调用协调完成业务操作。一个典型的场景是商城系统的订单微服务和库存微服务,用户在下单时会访问订单微服务。订单微服务生成订单记录时,会调用库存微服务扣除库存。每个微服务部署在不同的JVM进程中,此时就会出现跨JVM进程导致的分布式事务问题。商城系统跨JVM进程产生分布式事务的场景如图6所示。图6 市场系统跨JVM进程产生分布式事务2.跨数据库实例单个系统访问多个数据库实例,即跨-数据源访问会产生分布式事务。比如系统中的订单数据库和交易数据库是放在不同的数据库实例中的。当用户发起退款时,会同时操作用户的订单数据库和交易数据库(退款操作在交易数据库中进行,订单状态变为Refunded)。由于数据分布在不同的数据库实例中,需要不同的数据库连接会话来操作数据库中的数据,从而产生分布式事务。商城系统中跨数据库实例产生分布式事务的场景如图7所示。图7 商城系统跨数据库实例产生分布式事务3.多个服务访问同一个数据库多个微服务访问同一个数据库,例如,订单微服务和事务微服务访问同一个数据库会产生分布式事务Transaction,原因是多个微服务访问同一个数据库,本质上是通过不同的数据库会话操作数据库,此时会产生分布式事务。商城系统中多个服务访问单个数据库产生分布式事务的场景如图8所示。图8 商城系统中多个服务访问单个数据库产生分布式事务的场景跨数据库实例场景和多业务访问单一数据库的场景,本质上是会产生不同的数据库会话来操作数据库中的数据,从而产生分发形式的事务。这两种情况都比较容易被忽略。本书节选自《深入理解分布式事务:原理与实践》,经出版社授权发布。