什么是多运行时架构?(上)

简介: 什么是多运行时架构?(上)

服务化演进中的问题

自从数年前微服务的概念被提出,到现在基本成了技术架构的标配。微服务的场景下衍生出了对分布式能力的大量需求:各服务之间需要相互协作和通信,以及共享状态等等,因此就有了各种中间件来为业务服务提供这种分布式能力。

我们熟知的“Spring Cloud 全家桶”正是凭借着对各种中间件优秀的集成与抽象能力,成为了当时炙手可热的项目。

然而随着业务的快速发展,组织规模的不断扩大,微服务越来越多,系统规模越来越大则是服务化体系架构演进的必然。这就带来了两方面复杂度的上升:

1.服务治理与接入的复杂度

服务治理代表了系统中服务资源的地图及其获取途径,例如通过注册发现服务提供图谱能力,路由、网关、负载均衡服务提供获取途径。

服务接入则代表了如何使用系统中的服务能力,例如通过中间件提供的API 协议或是封装的 SDK 来接入该中间件。各种业务服务越多、中间件越复杂,整个系统服务治理与接入的复杂度就会急剧上升。

2.团队协作的复杂度

该复杂度主要体现在团队的认知负载上,复杂的依赖、沟通、协作将明显拖慢交付进度。正如康威定律所述的,由于服务复杂度的上升,团队之间的交互成本也随之上升。

如下是复杂度上升问题的一个显而易见的例子。

当系统中的中间件都通过 SDK 作为其外化能力的控制方式,来封装协议、数据结构与操作方法。随着中间件数量和种类不断增多,大量孤立的 SDK 被绑定在业务服务上,导致两方面问题:

  • 版本升级困难:SDK 与业务服务的强依赖性导致想要升级 SDK 版本变得异常复杂与缓慢
  • 业务服务难以异构:SDK 所支持的语言反向限制了业务服务所能选择的语言,例如 Spring Cloud 几乎没有官方的多语言支持

如何治理这种不断上升的复杂度呢?复杂问题归一化是一种不错的手段。

什么是多运行时架构

多运行时微服务架构(Multi-Runtime Microservice Architecture)也被简称为多运行时架构,是由 Red Hat 的首席架构师 Bilgin Ibryam 在 2020 年初所提出的一种微服务架构形态,它相对完整地从理论和方法的角度阐述了多运行时架构的模型(实际上,在 2019 年末,微软的 Dapr v0.1.0 就已经发布)。

暂时先抛开到底什么是“多运行时”不谈(因为多运行时这个名字个人觉得起得可能不太妥当),先看看多运行时架构都包括了哪些内容。

分布式应用四大类需求

上一节提到,为了治理不断上升的复杂度问题,归一化是手段之一。归一化的第一步就是对问题进行归类。

Bilgin Ibryam 梳理了分布式应用的各类需求后,将其划分到了四个领域内:

(来源:Multi-Runtime Microservices Architecture)

分别是:

  • 生命周期:即应用从开发态到运行态之间进行打包、部署、扩缩容等需求。
  • 网络:分布式系统中各应用之间的服务发现、容错、灵活的发布模式、跟踪和遥测等需求。
  • 状态:我们期望服务是无状态的,但业务本身一定需要有状态,因此包含对缓存、编排调度、幂等、事务等需求。
  • 绑定:与外部服务之间进行集成可能面临的交互适配、协议转换等需求。

Bilgin Ibryam 认为,应用之间对分布式能力的需求,无外乎这四大类。且在 Kubernetes 成为云原生场景下运行时的事实标准后,对生命周期这部分的需求已经基本被覆盖到了。

因此实际上我们更关注的是如何归一化其他三种需求。

与单机应用的类比

单机应用一般大都是以用户态进程的形式运行在操作系统上。显然,与微服务类似,单机应用的核心关注点也是业务逻辑,与业务关系不大的支撑能力,都要依赖操作系统来完成。

因此上述由 Bilgin 归纳的分布式应用四大类需求,其实我们很容易就可以和单机应用进行合理的类比:

从上述类比来看我们发现,单单是 Kubernetes 可能还不足以称为是 “云原生操作系统”,除非有一种解决方案,能在分布式环境下,把其他几项支撑能力也进行归一化整合,才能理直气壮的冠此大名。」

Service Mesh 的成功

Service Mesh 在近几年的高速发展,让我们认识到网络相关的需求是如何被归一化并与业务本身解耦的:

通过流量控制能力实现多变的发布模式以及对服务韧性的灵活配置,通过安全能力实现的开箱即用的 mTLS 双向认证来构建零信任网络,通过可观察性能力实现的网络层Metrics,Logging 和 Tracing 的无侵入式采集。

而上述服务治理能力,全部被代理到 Sidecar 进程中完成。这就实现了 codebase level 的解耦,网络相关的分布式能力完全抛弃 SDK。

伴随着 Service Mesh 的成功,我们不禁会想到,是否可以将另外的两种需求——状态和绑定 ——也进行 Mesh 化改造呢?

分布式能力 Mesh 化

基于对 Service Mesh 的拓展,我们大可以将其他的能力也进行 Mesh 化,每一类能力都以 Sidecar 的形式部署和运作:

在业界也有不少从某些能力角度切入的方案:

(来源:Multi-Runtime Microservices Architecture)

我们可以发现,各类方案都有自己的一套对某些能力需求的 Mesh 化方案,合理地选择它们,的确满足了分布式能力 Mesh 化的要求,但却引入了新的问题:

  • 复杂度从业务服务下沉到了 Mesh 层:多种 Mesh 化方案之间缺乏一致性,导致选型和运维的成本很高
  • 多个 Sidecar 进程会带来不小的资源开销,很多解决方案还需要搭配控制面进程,资源消耗难以忽视

对业务复杂度上升的归一化,现在变成了对 Mesh 复杂度上升的归一化。

Multi-Runtime = Micrologic + Mecha

Bilgin Ibryam 在多运行时微服务架构中,对前述讨论的各种问题点进行了整合,提出了 Micrologic + Mecha 的架构形态:

(来源:Multi-Runtime Microservices Architecture)

在 Micrologic 中只包含业务逻辑,尽可能的把分布式系统层面的需求剥离出去,放到 Mecha 中。从 Mecha 的命名就可以明白它的功能:

由提供各种分布式能力的 “机甲” 组成的 Sidecar 进程,与 “裸奔的” 业务逻辑一起部署。因为是 Micrologic 进程和 Mecha 进程共同部署的这种多个 “运行时” 的架构,所以称之为 “多运行时架构”。

Mecha 不仅成功地将分布式能力从耦合的业务进程中抽取出来,还整合了方案,避免了多种方案混合的额外成本。可以说 Mecha 在本质上提供了一个分布式能力抽象层。

因此与其叫 “多运行时架构”,不如叫 “面向能力的架构”。

相关文章
|
2月前
|
运维 Linux Apache
LAMP架构调优(二)——修改Apache运行用户
LAMP架构调优(二)——修改Apache运行用户
197 1
|
5月前
|
资源调度 分布式计算 Java
Flink(三)【运行时架构】
Flink(三)【运行时架构】
|
7月前
|
安全 持续交付 开发者
Docker 架构解析:多角度解析 Docker 引擎与容器运行时
Docker 架构解析:多角度解析 Docker 引擎与容器运行时
56 0
|
7月前
|
持续交付 虚拟化 Docker
Docker 架构解析:理解 Docker 引擎和容器运行时
Docker 架构解析:理解 Docker 引擎和容器运行时
459 1
|
7月前
|
Kubernetes 监控 Docker
深入解析 Kubernetes 架构:掌握主节点、工作节点和容器运行时
深入解析 Kubernetes 架构:掌握主节点、工作节点和容器运行时
112 0
|
4月前
|
缓存 负载均衡 应用服务中间件
【分布式技术专题】「分析Web服务器架构」Tomcat服务器的运行架构和LVS负载均衡的运行机制(修订版)
在本章内容中,我们将深入探讨 Tomcat 服务器的运行架构、LVS 负载均衡的运行机制以及 Cache 缓存机制,并提供相应的解决方案和指导。通过理解这些关键概念和机制,您将能够优化您的系统架构,提高性能和可扩展性。
208 4
【分布式技术专题】「分析Web服务器架构」Tomcat服务器的运行架构和LVS负载均衡的运行机制(修订版)
|
4月前
|
NoSQL Java 关系型数据库
基于java Swing 和 mysql实现的飞机订票系统(源码+数据库+ppt+ER图+流程图+架构说明+论文+运行视频指导)
基于java Swing 和 mysql实现的飞机订票系统(源码+数据库+ppt+ER图+流程图+架构说明+论文+运行视频指导)
238 0
|
6月前
|
缓存 分布式计算 资源调度
Spark2:运行架构
Spark2:运行架构
181 0
|
6月前
|
运维 NoSQL 中间件
什么是多运行时架构?(下)
什么是多运行时架构?(下)
228 0
|
7月前
|
资源调度 分布式计算 调度
Fink--3、Flink运行时架构(并行度、算子链、任务槽、作业提交流程)
Fink--3、Flink运行时架构(并行度、算子链、任务槽、作业提交流程)