
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所示。

图2-5 FaaS架构中的请求处理流程图(有可用实例)
可以看出,在请求进入FaaS平台后,请求处理模块会在实例管理模块中查询是否有可用(空闲状态)的实例。如有空闲实例,则将对应的请求调度到该实例中。此时,如果实例第一次处理请求,则会执行初始化操作,加载业务代码。之后实例会执行分配的请求,运行用户代码并返回结果。
上述情况并不是一直存在的。当遇到业务请求突增,需要弹性扩容时,FaaS环境中实例资源池不足,则新的请求会按照图2-6所示的流程进行处理。

图2-6 FaaS架构中的请求处理流程图(无可用实例)
在业务突增的情况下,资源池中无可用实例。请求处理模块收到请求后,会先去实例管理模块查询是否有可用实例。如无可用实例,则去资源调度模块中申请扩容。资源调度模块会创建新的实例加入资源池。此时,实例管理模块会对新的实例进行初始化操作(创建运行环境、加载业务代码等)。初始化完毕后,新实例会执行分配到的请求,运行用户代码并返回结果。
分析请求的处理流程可知,因为FaaS平台屏蔽了许多底层的调度、扩缩容策略,所以内部的请求处理链路较长。尤其是在业务请求突增的情况下,需要通过资源调度模块分配实例,并且对实例进行初始化。这一系列处理流程太久,就会造成“冷启动”的问题,即首次请求到达FaaS平台延时过长。关于“冷启动”的成因、现状和优化措施,本书会在第3章详细说明。