首页
学习
活动
专区
工具
TVP
发布
精选内容/技术社群/优惠产品,尽在小程序
立即前往

系统集成项目管理工程师(第3版):信息系统架构--常用架构模式

云原生架构有非常多的架构模式,不同的组织环境、业务场景和价值定位等,通常采用不同的架构模式,常用的架构模式主要有服务化架构、Mesh 化架构、Serverless、存储计算分离、分布式事务、可观测、事件驱动等。

1.服务化架构模式

服务化架构是新时代构建云原生应用的标准架构模式,要求以应用模块为颗粒度划分一个软件,以接口契约(例如IDL)定义彼此业务关系,以标准协议(HTTP、gRPC 等)确保彼此的互联互通,结合领域模型驱动(Domain DrivenDesign,DDD)、测试驱动开发(Test DrivenDevelopment,TDD)、容器化部署提升每个接口的代码质量和迭代速度。服务化架构的典型模式是微服务和小服务模式,其中小服务可以看作是一组关系非常密切的服务的组合,这组服务会共享数据。小服务模式通常适用于非常大型的软件系统,避免接口的颗粒度太细而导致过多的调用损耗(特别是服务间调用和数据一致性处理)和治理复杂度。

通过服务化架构,把代码模块关系和部署关系进行分离,每个接口可以部署不同数量的实例,单独扩缩容,从而使得整体的部署更经济。此外,由于在进程级实现了模块的分离,每个接口都可以单独升级,从而提升了整体的迭代效率。但也需要注意,服务拆分导致要维护的模块数量增多,如果缺乏服务的自动化能力和治理能力,会让模块管理和组织技能不匹配,反而导致开发和运维效率的降低。

2.Mesh化架构模式

Mesh(网格)化架构是把中间件框架(如 RPC、缓存、异步消息等)从业务进程中分离,让中间件的软件开发工具包(SoftwareDevelopment Kit,SDK)与业务代码进一步解耦,从而使得中间件升级对业务进程没有影响,甚至迁移到另外一个平台的中间件也对业务透明。分离后在业务进程中只保留很“薄”的Client 部分,Client 通常很少变化,只负责与Mesh 进程通信,原来需要在SDK中处理的流量控制、安全等逻辑由 Mesh 进程完成。整个架构如图4-28所示。

实施Mesh化架构后,大量分布式架构模式(如熔断、限流、降级、重试、反压、隔仓等)都由 Mesh 进程完成,即使在业务代码的制品中并没有使用这些三方软件包;同时获得更好的安全性(比如零信任架构能力等),按流量进行动态环境隔离,基于流量做冒烟/回归测试等。

3.Serverless 模式

Serverless(无服务器)将“部署”这个动作从运维中“收走”,使开发者不用关心应用运行地点、操作系统、网络配置、CPU性能等。从架构抽象上看,当业务流量到来/业务事件发生时,云会启动或调度一个已启动的业务进程进行处理,处理完成后云自动会关闭/调度业务进程,等待下一次触发,也就是把应用的整个运行都委托给云。Serverless并非适用任何类型的应用,因此架构决策者需要关心应用类型是否适合于Serverless 运算。如果应用是有状态的,由于 Serverless的调度不会帮助应用做状态同步,因此云在进行调度时可能导致上下文丢失;如果应用是长时间后台运行的密集型计算任务,会无法发挥 Serverless的优势;如果应用涉及频繁的外部 IO(包括网络或者存储,以及服务间调用等),也因为繁重的I/O负担、时延大而不适合。Serverless非常适合于事件驱动的数据计算任务、计算时间短的请求/响应应用、没有复杂相互调用的长周期任务。事件驱动架构图如图4-29所示。

4.存储计算分离模式

分布式环境中的 CAP(一致性:Consistency;可用性:Availability;分区容错性:Partition tolerance)困难主要是针对有状态应用,因为无状态应用不存在C(一致性)这个维度,因此可以获得很好的A(可用性)和P(分区容错性),因而获得更好的弹性。在云环境中,推荐把各类暂态数据(如 session)、结构化和非结构化持久数据都采用云服务来保存,从而实现存储计算分离。但仍然有一些状态如果保存到远端缓存,会造成交易性能的明显下降,比如交易会话数据太大、需要不断根据上下文重新获取等,这时可以考虑通过采用时间日志十快照(或检查点)的方式,实现重启后快速增量恢复服务,减少不可用对业务的影响时长。

5.分布式事务模式

微服务模式提倡每个服务使用私有的数据源,而不是像单体这样共享数据源,但往往大颗粒度的业务需要访问多个微服务,必然带来分布式事务问题,否则数据就会出现不一致。架构师需要根据不同的场景选择合适的分布式事务模式。

(1)传统采用XA(eXtended Architecture)模式,虽然具备很强的一致性,但是性能差。

(2)基于消息的最终一致性通常有很高的性能,但是通用性有限。

(3)TCC(Try-Confirm-Cancel)模式完全由应用层来控制事务,事务隔离性可控,也可以做到比较高效;但是对业务的侵入性非常强,设计开发维护等成本很高。

(4)SAGA模式(指允许建立一致的分布式应用程序的故障管理模式)与TCC模式的优缺点类似但没有Try这个阶段,而是每个正向事务都对应一个补偿事务,也使开发维护成本高。

(5)开源项目 SEATA的AT模式非常高性能,无代码开发工作量,且可以自动执行回滚操作,同时也存在一些使用场景限制。

6.可观测架构

可观测架构包括 Logging、Tracing、Metrics 三个方面,Logging提供多个级别(verbose/debug/warning/error/fatal)的详细信息跟踪,由应用开发者主动提供;Tracing 提供一个请求从前端到后端的完整调用链路跟踪,对于分布式场景尤其有用;Metrics则提供对系统量化的多维度度量。架构决策者需要选择合适的、支持可观测的开源框架(比如 Open Tracing、Open Telemetry等),并规范上下文的可观测数据规范(例如方法名、用户信息、地理位置、请求参数等),规划这些可观测数据在哪些服务和技术组件中传播,利用日志和 Tracing信息中的 spanid/traceid,确保进行分布式链路分析时有足够的信息进行快速关联分析。

由于建立可观测性的主要目标是对服务SLO(Service Level Objective)进行度量,从而优化 SLA(Service Level Agreement,服务水平协议),因此架构设计上需要为各个组件定义清晰的 SLO,包括并发度、耗时、可用时长、容量等。

7.事件驱动架构

事件驱动架构(Event Driven Architecture,EDA)本质上是一种应用/组件间的集成架构模式。事件和传统的消息不同,事件具有Schema,所以可以校验 Event 的有效性,同时 EDA具备QoS保障机制,也能够对事件处理失败进行响应。事件驱动架构不仅用于(微)服务解耦,还可应用于下面的场景中。

(1)增强服务韧性。由于服务间是异步集成的,也就是下游的任何处理失败甚至宕机都不会被上游感知,自然也就不会对上游带来影响。

(2)CQRS(Command Query Responsibility Segregation,命令查询的责任分离)。把对服务状态有影响的命令用事件来发起,而对服务状态没有影响的查询才使用同步调用的API 接口;结合EDA 中的Event Sourcing 机制可以用于维护数据变更的一致性,当需要重新构建服务状态时,把EDA中的事件重新“播放”一遍即可。

(3)数据变化通知。在服务架构下,往往一个服务中的数据发生变化,另外的服务会感兴趣,比如用户订单完成后,积分服务、信用服务等都需要得到事件通知并更新用户积分和信用等级。

(4)构建开放式接口。在EDA下,事件的提供者并不用关心有哪些订阅者,不像服务调用一一数据的产生者需要知道数据的消费者在哪里并调用它,因此保持了接口的开放性。

(5)事件流处理。应用于大量事件流(而非离散事件)的数据分析场景,典型应用是基于Kafka的日志处理。

(6)基于事件触发的响应。在IoT 时代大量传感器产生的数据,不会像人机交互一样需要等待处理结果的返回,天然适合用 EDA 来构建数据处理应用。

整理不易动动你发财的小手点个“在看”哦!

您的支持是我坚持的动力,谢谢

  • 发表于:
  • 原文链接https://page.om.qq.com/page/Oq0tw2CCQ1Q0byhqhkIlQVTg0
  • 腾讯「腾讯云开发者社区」是腾讯内容开放平台帐号(企鹅号)传播渠道之一,根据《腾讯内容开放平台服务协议》转载发布内容。
  • 如有侵权,请联系 cloudcommunity@tencent.com 删除。

扫码

添加站长 进交流群

领取专属 10元无门槛券

私享最新 技术干货

扫码加入开发者社群
领券