后台分布式架构形形色色,特别是微服务和云原生的兴起,诞生了一批批经典的分布式架构,然而在公司内部,或者其他大型互联网企业,都是抛出自己的架构,从接入层,逻辑层,数据层都各有特点,但这些系统设计中到底是出于何种考量,有没有一些参考的脉络呢,本文将从云原生和微服务,有状态服务,无状态服务以及分布式系统等维度探讨这些脉络。
关注腾讯云开发者,一手技术干货提前解锁👇
//////////
10 月 24 日晚 8 点,腾讯云开发者视频号「鹅厂程序员面对面」直播间,邀你共同论道《1024:AI时代 程序员何去何从》,预约观看有机会抢鹅厂周边好礼!
下面这个定义来自于经典的《Designing Data-Intensive Application》:
一个涉及通过网络进行通信的多台机器的系统被称为分布式系统。需要分布式系统,一般是希望能从分布式系统达到以下的好处:
分布式系统虽然能带来这些好处,但是分布式系统也存在很多挑战。通过网络传输的每个请求和 API 调用都需要处理可能发生的故障:网络可能中断,服务可能过载或崩溃,请求超时。
但 DDIA 定义主要是基于有数据有状态来讨论分布式,但是从现实的实践中,分布式系统存在有状态和无状态两种:
类型 | 相关描述 |
---|---|
有状态 | 特点:有状态服务会在自身保存一些数据,因此先后的请求是有关联的。处理一个请求可能需要依赖之前请求的结果或上下文信息,这些信息被保存在服务的状态中。由于有状态服务需要维护状态的一致性,因此在扩展或部署时需要考虑状态迁移和同步的问题。有状态服务通常用于需要维护用户会话、事务处理或需要保持数据一致性的场景。相关理论:CAP理论,CAP理论是指在分布式系统设计中,一致性(Consistency)、可用性(Availability)和分区容错性(Partition Tolerance)这三个特性无法同时满足。一致性指的是在分布式系统中的所有数据备份在同一时刻是否同样的值;可用性指的是每个请求不管成功或者失败都有响应;分区容错性指的是系统中任意信息的丢失或失败不会影响系统的继续运作。BASE理论:BASE理论是对CAP定理的一种实用化延伸,强调在分布式系统中适当放宽对强一致性的要求,以换取更高的可用性和系统性能。其核心思想是:我们无法做到强一致,但每个应用可以根据自身的业务特点,采用适当的方式来使系统达到最终一致性。 |
无状态 | 特点:无状态服务在处理请求时不依赖其他请求,每个请求都是独立的。处理一个请求所需的全部信息要么包含在请求本身中,要么可以从外部资源(如数据库)中获取。服务器本身不存储任何与请求相关的状态信息,因此不需要在请求之间保持状态的一致性。由于无状态服务的独立性,它们通常更容易扩展和部署,因为不需要考虑状态迁移或同步的问题。特别的,是各种并行计算相关框架,比如:MapReduce算法OpenMPMPI框架 |
相关理论:
无状态特点:
特别的,是各种并行计算相关框架,比如:
为什么我们要重点说有状态的分布式架构?
目前大部分业务应用场景(特别是 to c 业务)需要存储用户的数据以及业务数据,本质还是数据密集型系统,也就是有状态的服务,那么如何设计好一个有状态的分布式架构,是大部分业务都会面临的共同问题,也是本文的重点。
这里给出设计有状态分布式架构,需要的一些考虑:
下面的图都涉及到两个概念,这两个概念很多业务分层的概念,本文用这个分层来作为例子讨论:
AO:封装了应用程序的业务逻辑和处理流程。AO 主要负责处理用户请求,调用相关的原子服务来完成特定的任务。它通常位于微服务的顶层,与其他对象进行交互,协调不同的功能模块。
BO:微服务中相关的原子服务,负责业务原子化的服务,通过被各种 AO 服务调用。功能可以是某个特定的业务原子功能,也可以是和数据打交道的原子服务。
实现有状态的分布式系统,通常有以下三种:
2.1 单体应用
单体架构是一种传统的架构方式,应用程序作为一个整体进行开发、测试和部署。
优点
面临的问题
2.2 SOA 架构
SOA 架构更多是关注于改变IT服务在企业范围内的工作方式,SOA(面向服务的架构)定义了一种可通过服务接口复用软件组件并实现其互操作的方法。简单举个例子,使用 SOAP(简单对象访问协议)/HTTP 或 Restful HTTP (JSON/HTTP) 等标准网络协议来公开服务算是 SOA 的一种。
优点
面临的问题
2.3 微服务
微服务架构是一种云原生架构常用的实现方式,在这种方法中,单个应用程序由很多松散耦合并能够独立部署的更小组件或服务组成。一般认为是 SOA 架构的一种变体,一般也会使用 SOA 的原则来设计接口,但微服务更强调基于云原生,独立部署,和 devops,持续交付是一脉相承的。
优点
除了类似于 SOA 的优点,还有以下优点
对比 SOA,主要是在部署和运维难度上提升了,但是又引入了以下一些需要解决的问题:
通过上面讨论,目前微服务来实现分布式系统是比较符合云原生的趋势,所以下面的讨论主要是基于微服务化的设计。
下面针对微服务设计需要解决的问题,一起探讨下上面微服务需要解决的1-5个方面在系统该如何实现(第6点方案比较明确,这里不展开讲述):
从上面单体应用架构,微服务架构,可以看出明显的差别,就是单体应用架构每个服务都可以提供完整的服务,那么用户和后台链接数可以通过服务的无限扩容得到满足,但是微服务不行,微服务的每个对外的服务接口都得和用户建立链接,就会存在两个最主要的问题:
那么这个时候引入一个中间层隔离用户和后端服务是非常必要,这个中间层负责对接用户的链接,然后把请求往业务服务上发。同时考虑服务的用户有地域性,可以把中间层分成两个部分:
这时微服务架构就如下:
3.1 区域化网络接入层
这一层需要解耦的重点是把用户的实际地域 和 业务的逻辑RS 对应起来,同时避免每个业务都去建设类似的架构,同时解决用户体验,让用户尽量访问离用户最近的业务机器,减少耗时。
所以用户到区域化网络层应该是地域就近,区域化网络层到业务网关也是就近,深圳对应深圳,上海对应上海,并且考虑机房间就近。
3.2 业务网关
从上面分析可以看到,业务网关的作用最主要是透明服务代理(命令字转发),但业务网关还能提供如下作用:
业务网关的主要构成有:具有代理用户的接入服务 + 具有路由的转发服务。
路由实现又包含三个部分,路由存储、路由计算、路由容灾。
4.1 条带化
为啥说微服务的服务容错能力,要到这个概念?
微服务在部署上,特别是在云上,一种服务进行多份同构部署,以提供容灾的可能性,如果多种微服务的部署机房是无序的,那么在故障出现时,就很容易出现服务的调用链路,部分正常,部分故障,就算故障服务被剔除系统外,链路也是来回穿梭在多个机房,耗时和故障影响都不可控。(考量一些服务半死不活,也会形成二次打击)。
所以一个比较简洁的方案是一个完整的服务集群部署在同一个物理单元,在物理单元的粒度上进行服务的容错,同时在同一个物理单元内,微服务内的时耗也是最低的。
把一个完整服务集群部署在同一个物理单元(或者多个物理单元构成的逻辑单元),并且隔离流量的做法叫做条带化,其中每一个条带化的单元也叫做 set,也有人称之为单元化和逻辑单元,下文主要以条带化和 set 来表述。
使用条带化的好处:
那么是不是自上而下都是条带化(包括逻辑层,数据层),就可以保证业务整体都有容灾能力呢?我们来对比下。
自上而下全部条带化
这个方案是把业务关心的内容都包括在条带化容灾里面,但从上面可以直接得看出因为用户存储数据不一定是在就近接入的业务网关的那个 set,所以业务网关实际也是有可能回路由到其他服务,这里其实就破坏了条带化。这种条带化没有达到流量隔离的目的。比如某个 set 的 ao 耗时变慢了,所有 set 的业务网关会收到影响,这个 set 所在机器也有可能受影响,进而导致这个 set 的 ao 和 bo 也受影响。故障会扩散。
除此之外,这种方案还有以下缺点:
接入层以下条带化
这个方案是把逻辑层和数据层放在 set 里面。
这种方案的缺点:
仅逻辑层条带化
这种方案,便是逻辑层 看作是无状态的微服务集群,把有状态的界限尽量限定在数据层,避免耦合逻辑层比较多的无状态服务。在设计微服务时,应当遵守无状态服务设计原则,与底层基础设施解耦,从而实现在不同容器之间自由调度。对于有状态的微服务而言,通常使用计算与存储分类的方式,将数据下层到分布式存储方案中,从而一定程度上实现服务无状态化。
这样做的可以解决上面两种方案 数据层耦合限制 ao 和 bo 扩容 的缺点,但是为了保证尽早跨城,尽量减少跨城,业务网关路由可以和数据库 proxy 的路由具有一定 联动关系。尽可能在业务网关路由时通过用户地域路由(在用户地域存储数据也是最优方案)的方式减少跨城。
具体的联动方式说明:
4.1.1 条带化粒度选型
既然微服务的容灾单元是 set,解决的主要是物理级别的故障,那么 set 条带化粒度的选型有哪些考量,下面给个表格参考:
条带化粒度 | 业务考量 | 必要的条件 | 备注 |
---|---|---|---|
城市 | 除非因为投入产出成效低等不考量容灾,一般都至少要求城市级别 | 服务发现支持城市级别 | 一般能满足风火水电隔离,还也可能存在就近城市群有基础设施共用,所以一般选择距离较远的两地,比如深圳,上海 |
IDC(AZ可用区) | 业务是否有多IDC的成本,是否有可以物理隔离的IDC预算IDC故障时,进行跨城切换对业务耗时,可用性影响比较大 | 服务发现支持IDC级别有物理隔离的IDC,风火水电隔离 | 推荐 |
机架(机柜) | 业务是否有多机架的成本,是否有可以物理隔离的机架预算机架故障时,进行IDC切换对业务耗时,可用性影响比较大 | 服务发现支持机架级别有物理隔离的机架,最好是风火水电都是隔离的 | 一般一个IDC的机架很多设施都是共用的。如量化交易,进行主机托管和交易所就近的话,如果出现机架的故障,就切IDC,会让交易变慢,从而业务受损,所以能切换机架是更好的。 |
机器(OMP) | 业务是否属于耗时敏感,有要求强一致性,跨机器访问也不太能忍受业务是否自研了一些配套部署措施来匹配,比如极致条带化 | 服务发现支持严格机器级别(或者是只允许本机互调) | 一般不建议,因为上云之后就更难保证一台机器有所有微服务功能,能完整构成一套服务但是类似微信支付这种高并发又需要强一致的业务,可以考虑 |
一般能满足风火水电隔离,还也可能存在就近城市群有基础设施共用,所以一般选择距离较远的两地,比如深圳,上海IDC(AZ可用区)
推荐机架(机柜)
一般一个IDC的机架很多设施都是共用的。如量化交易,进行主机托管和交易所就近的话,如果出现机架的故障,就切IDC,会让交易变慢,从而业务受损,所以能切换机架是更好的。机器(OMP)
一般不建议,因为上云之后就更难保证一台机器有所有微服务功能,能完整构成一套服 务但是类似微信支付这种高并发又需要强一致的业务,可以考虑
微业务服务的互相调用,主要是业务网关发现 set,set 内微服务的互相发现,这两个都可以通过服务发现来做。
为了保证条带化(物理隔离,流量隔离),以及 set 内的完整性,服务发现时,应该尽量在条带化粒度内服务可以互相发现,条带化粒度外服务不能互相发现(容灾降级应该由 set 间的容灾策略决定),我们选择的服务发现组件一定要支持的一个能力。
在云原生的场景,一般存在两种服务发现实现方案,集中式服务发现,以及服务网格。
集中式服务发现与服务网格的主要区别在于它们解决的问题范围和实现方式。
集中式服务发现是一种服务注册和发现机制,通过一个中心化的服务注册表来管理所有服务的IP地址和相关信息。每当服务上线或下线时,它会向注册表注册或注销自己,其他服务在需要时查询注册表以获取其他服务的地址。这种方式简化了服务之间的通信,但需要维护一个中心化的服务注册表,可能成为单点故障,并且需要处理网络延迟和单点故障问题。
服务网格则是一种专用的基础设施层,用于管理分布式应用程序中各个微服务之间的通信。它通过部署在应用服务旁边的代理(称为 sidecar)来处理服务之间的通信,提供服务发现、负载均衡、流量路由、身份验证和可观测性等功能。服务网格将网络通信的复杂性抽象化,使开发人员能够专注于应用程序逻辑,而不必处理底层的网络代码。它通过分布式的方式提供服务,避免了单点故障,并且提供了更高的灵活性和可扩展性。
总结来说,集中式服务发现通过中心化的方式简化服务之间的通信,但可能面临单点故障和网络延迟的问题;而服务网格通过分布式代理网络提供更高级的通信管理功能,具有更高的灵活性和可扩展性。
虽然有可能因为集中式服务发现故障不可用,但可以通过本地 SDK 接入提供本地缓存和异步更新的功能,也能一定程度上缓解单点依赖。相对来说如果服务网格的控制面故障了,其实也在短时间内没办法更新容器的网络策略。
如上所说微服务的部署是一个难题,微服务化后,服务数量都会比原来单服务数量多了十几倍,那么自动化部署,自动化扩容就成为微服务化一个必要项。所幸的是伴随着云原生的发展,容器编排系统也在飞速发展,其中 kubernetes 是代表性的容器化部署编排系统。
那么在支持条带化上,kubernetes 应该需要支持set 内机器横向扩容,set 间也能横向扩容。
要达到这个目的,一般需要几方面的支持:
微服务还有一个需要解决的问题,就是数据服务隔离的问题,数据存储是系统有状态的来源,可以分为以下两种情况讨论:
考虑数据分片的因素主要是包括以下考虑之一:
这里提供一种指导:
经过上面讨论,一种有状态的分布式系统设计的整体架构图可以如下:
8.1 各层的容灾分析
以下都是基于机器足够的情况,性能机器预留就按照每个业务进行评估。
区域网络化接入层
业务网关
逻辑层
数据层的容灾切换,一方面可以依赖逻辑层访问 db 故障后,返回给业务网关的错误码来实现从逻辑层开始切换,一方面可以依赖分布式存储系统自己的切换能力。
降级策略
业务网关也有一些其他应对故障的降级方案,如果在整体系统故障的情况下,可以这么处理降级:
-End-
原创作者|黄楠驹
扫码关注腾讯云开发者
领取腾讯云代金券
Copyright © 2013 - 2025 Tencent Cloud. All Rights Reserved. 腾讯云 版权所有
深圳市腾讯计算机系统有限公司 ICP备案/许可证号:粤B2-20090059 深公网安备号 44030502008569
腾讯云计算(北京)有限责任公司 京ICP证150476号 | 京ICP备11018762号 | 京公网安备号11010802020287
Copyright © 2013 - 2025 Tencent Cloud.
All Rights Reserved. 腾讯云 版权所有