Serverless从入门到进阶:架构、原理与实践
上QQ阅读APP看书,第一时间看更新

2.2 FaaS架构介绍

本节主要介绍FaaS架构。FaaS架构屏蔽了许多底层实现,可以让使用者更加专注于业务。总的来说,FaaS架构帮助开发者做了下面几件事。

  • 通过负载均衡进行请求调度和转发。
  • 通过集群调度实现计算资源的弹性扩缩容。
  • 对请求做错误处理。
  • 安全隔离不同租户的资源。

这些优化策略分别对应了FaaS架构中的不同模块,本书后续将详细介绍这些组成模块以及请求在模块间的执行流程。

2.2.1 FaaS架构组成

在通用的FaaS平台中,为了实现请求转发、扩缩容、租户隔离等能力,需要以下模块的支持。

  • 负载均衡器:用于接收请求并转发到最近的后端服务中(往往适用于多地域、多可用区的部署方式)。
  • 请求处理模块:用于接收和处理请求,区分同步和异步请求等。
  • 计数器:用于计算并发请求,并调整实例的并发限制等。
  • 实例(worker):FaaS架构中最核心的部分,为用户代码提供安全隔离、多语言支持的运行环境。
  • 实例管理模块(worker manager):用于调度请求到对应的实例中。通过追踪实例的状态(繁忙或空闲),针对状态信息分配请求,将请求调度到处于空闲状态的容器中。
  • 资源调度模块:管理实例的资源池。在确保不影响用户业务的前提下,用最合理的方式创建或销毁实例,确保资源池内的实例资源充足、可复用。

2.2.2 FaaS架构执行流程

为了让读者能更清晰地理解FaaS服务的运行原理,我们模拟在不同场景下一个请求进入FaaS平台被处理的全流程。在FaaS环境中已有可用实例的情况下,请求的执行流程如图2-5所示。

030-1

图2-5 FaaS架构中的请求处理流程图(有可用实例)

可以看出,在请求进入FaaS平台后,请求处理模块会在实例管理模块中查询是否有可用(空闲状态)的实例。如有空闲实例,则将对应的请求调度到该实例中。此时,如果实例第一次处理请求,则会执行初始化操作,加载业务代码。之后实例会执行分配的请求,运行用户代码并返回结果。

上述情况并不是一直存在的。当遇到业务请求突增,需要弹性扩容时,FaaS环境中实例资源池不足,则新的请求会按照图2-6所示的流程进行处理。

030-2

图2-6 FaaS架构中的请求处理流程图(无可用实例)

在业务突增的情况下,资源池中无可用实例。请求处理模块收到请求后,会先去实例管理模块查询是否有可用实例。如无可用实例,则去资源调度模块中申请扩容。资源调度模块会创建新的实例加入资源池。此时,实例管理模块会对新的实例进行初始化操作(创建运行环境、加载业务代码等)。初始化完毕后,新实例会执行分配到的请求,运行用户代码并返回结果。

分析请求的处理流程可知,因为FaaS平台屏蔽了许多底层的调度、扩缩容策略,所以内部的请求处理链路较长。尤其是在业务请求突增的情况下,需要通过资源调度模块分配实例,并且对实例进行初始化。这一系列处理流程太久,就会造成“冷启动”的问题,即首次请求到达FaaS平台延时过长。关于“冷启动”的成因、现状和优化措施,本书会在第3章详细说明。