2. Serverless 基础:FaaS 与 BaaS 概念、事件驱动模型、无服务器计算的优势与挑战

在深入容量规划与自动扩缩容之前,必须建立对 Serverless 计算模型的准确理解。Serverless 并非“没有服务器”,而是将服务器的管理、容量规划、故障恢复等底层运维责任完全抽象,交给云平台。开发者只需关注业务代码与数据。本章将拆解其核心构成:FaaS、BaaS、事件驱动模型,并客观分析其优势与挑战。

2.1 FaaS 与 BaaS:Serverless 的两大支柱

Serverless 架构由两个核心服务类别组成:函数即服务(FaaS)和后端即服务(BaaS)。二者共同实现了“无服务器”的体验。

维度 FaaS(函数即服务) BaaS(后端即服务)
核心单元 函数(Function):一段无状态、短生命周期的代码 托管服务:数据库、对象存储、认证、消息队列等
运行模式 事件触发、按需执行、自动扩缩 始终在线、按量计费或预留容量
开发者关注点 业务逻辑、函数编排、依赖管理 数据模型、访问控制、服务集成
典型产品 AWS Lambda、阿里云函数计算、Azure Functions Amazon DynamoDB、阿里云 OSS、Firebase Auth
计费粒度 调用次数 + 执行时长(毫秒级) 存储量、请求次数、出网流量
关键理解: FaaS 是计算层,BaaS 是数据与基础设施层。在容量规划中,FaaS 的扩缩容由平台自动完成,而 BaaS 的容量(如数据库连接数、存储吞吐)往往需要提前规划或配置自动扩展策略。

2.2 事件驱动模型:Serverless 的“触发器”

FaaS 函数不会主动运行,它由事件触发。事件驱动模型是 Serverless 架构的“心脏”。理解事件源、触发器与函数的关系,是设计可扩缩系统的前提。

下图展示了典型的事件驱动流程:

事件驱动模型:从事件源到函数执行 HTTP 请求 (API Gateway) 对象存储事件 (文件上传/删除) 消息队列 (Kafka / MNS) 事件映射层 触发器绑定 事件过滤 重试策略 死信队列 并发控制 FaaS 函数实例 执行环境(沙箱) 无状态代码 自动扩缩至 N 实例 执行时长限制 返回结果 / 错误
容量规划启示: 事件源的类型和流量模式直接决定了 FaaS 函数的扩缩容行为。例如,来自消息队列的事件可以控制消费速率(背压),而来自 HTTP 网关的事件则可能产生突发流量,需要平台具备极快的冷启动和横向扩展能力。

2.3 无服务器计算的优势

从容量规划专家的视角看,Serverless 带来的核心优势集中在运维效率与资源利用率上。

  • 零容量规划: 平台根据请求量自动分配资源,无需预置服务器或担心峰值容量不足。这是传统架构与 Serverless 最本质的区别。
  • 精细化的按需付费: 只对实际执行的计算资源(CPU、内存)和调用次数付费。空闲时段成本趋近于零,消除了传统预留资源的浪费。
  • 近乎无限的弹性: 平台可以瞬间从 0 扩展到数千甚至数万个并发执行实例,适合流量波动极大的业务(如电商大促、视频转码)。
  • 降低运维复杂度: 补丁、操作系统升级、硬件故障均由云平台负责,团队可专注于业务代码。

2.4 无服务器计算的挑战

优势显著,但挑战同样不容忽视。在制定容量规划策略时,必须正视这些限制。

挑战领域 具体表现 对容量规划的影响
冷启动延迟 函数实例首次启动或长时间空闲后重新启动,需要加载运行时和代码,产生额外延迟(数百毫秒至数秒)。 需要规划预热策略(如定时触发器保持实例“热”),或接受冷启动带来的尾部延迟。
执行时长与资源限制 FaaS 函数通常有最大执行超时(如 15 分钟)和内存上限(如 10GB)。 长任务或内存密集型任务不适合直接使用 FaaS,需拆解为异步工作流或迁移至容器。
无状态约束 函数实例不保留本地状态,所有状态必须外部化到 BaaS 服务(如 Redis、数据库)。 每次调用都需建立外部连接,增加了延迟和 BaaS 服务的吞吐压力,需规划连接池和缓存。
调试与可观测性 分布式追踪困难,无法 SSH 登录实例,日志分散。 需要强大的可观测性基础设施(如链路追踪、结构化日志),否则容量瓶颈难以定位。
供应商锁定 FaaS 接口、BaaS 服务、事件源均与特定云厂商深度绑定。 跨云迁移成本高,容量规划工具和策略可能无法复用。
容量规划避坑: 不要因为 Serverless 宣称“自动扩缩”就完全放弃规划。你需要规划的是:
1. BaaS 服务的并发上限(如数据库连接数、API 限流)。
2. 函数的内存配置(影响执行速度和成本)。
3. 预留并发额度(避免冷启动和节流 Throttling)。

2.5 小结:Serverless 模型下的容量规划新范式