1. Serverless 与事件驱动概述
1.1 Serverless 架构定义
Serverless(无服务器)并非真的没有服务器,而是将服务器基础设施的运维、容量规划、弹性伸缩等复杂性从开发者视角中抽象掉。开发者只需关注业务代码与数据,云平台负责执行环境的全生命周期管理。
核心特征:
- 零运维:无需管理 OS、运行时、补丁、监控代理。
- 按需付费:仅按实际执行次数与资源消耗计费,无空闲成本。
- 自动弹性:从零到数千并发实例,平台自动扩缩。
- 事件驱动:函数由外部事件触发执行,非持续运行。
1.2 事件驱动模型核心概念
事件驱动架构(EDA)是 Serverless 的天然搭档。系统组件之间不直接调用,而是通过事件进行松耦合通信。一个组件产生事件,其他组件消费事件并做出响应。
| 概念 | 说明 | Serverless 中的角色 |
|---|---|---|
| 事件源 | 产生事件的实体,如 API 请求、文件上传、数据库变更 | 触发函数执行的入口 |
| 事件 | 描述状态变化的数据载荷,通常为 JSON 格式 | 函数的输入参数 |
| 事件通道 | 事件传输的管道,如消息队列、事件总线 | 解耦生产者与消费者 |
| 事件处理器 | 消费事件并执行逻辑的组件 | FaaS 函数 |
| 事件路由 | 根据事件类型/内容分发到不同处理器 | 事件总线规则 |
关键洞察: 事件驱动模型使 Serverless 应用具备异步、松耦合、高弹性的特性。在集群升级场景中,事件驱动意味着升级操作本身可以拆解为多个事件步骤,每个步骤由独立函数处理,从而实现细粒度的资源分配与回滚控制。
1.3 FaaS 与 BaaS 的区别
Serverless 架构由两大核心服务组成:FaaS(函数即服务)和BaaS(后端即服务)。理解二者的边界是设计事件驱动系统的前提。
| 对比维度 | FaaS(函数即服务) | BaaS(后端即服务) |
|---|---|---|
| 核心能力 | 运行用户自定义代码(函数) | 提供托管后端服务(数据库、认证、存储) |
| 执行模型 | 事件触发、短生命周期、无状态 | 持续运行、有状态、长生命周期 |
| 计费方式 | 按调用次数 + 执行时长 + 分配内存 | 按存储量、请求量、带宽等资源预购 |
| 开发者控制 | 完全控制代码逻辑,无运行时控制 | 仅控制数据与配置,无基础设施控制 |
| 典型产品 | AWS Lambda、阿里云函数计算、Knative | DynamoDB、Firebase、OSS、RDS |
| 集群升级场景 | 执行升级检查、迁移、回滚函数 | 存储升级状态、配置、日志 |
常见误区: 不要把长时间运行的任务塞进 FaaS 函数。FaaS 通常有最大执行时长限制(如 15 分钟)。集群升级中的长耗时操作(如大规模数据迁移)应拆分为多个事件步骤,或委托给 BaaS 的异步任务服务处理。
1.4 事件驱动 Serverless 的典型工作流
以下是一个标准的事件驱动 Serverless 工作流示例,展示了 FaaS 与 BaaS 如何协同完成一次集群升级中的资源分配决策:
- 事件触发:集群升级计划发布,事件总线收到
UpgradeScheduled事件。 - 函数执行:
resource-allocator函数被触发,读取当前集群资源快照(BaaS 存储)。 - 资源计算:函数根据升级策略计算所需预留资源,写入
AllocationPlan表(BaaS)。 - 事件输出:函数发出
AllocationReady事件,触发下一阶段函数执行。 - 状态持久化:每个步骤的状态变更自动记录到 BaaS 日志服务,用于审计与回滚。
// 示例:资源分配函数伪代码
exports.handler = async (event) => {
const { clusterId, upgradeVersion } = event.detail;
// 1. 从 BaaS 读取当前资源状态
const currentState = await baas.getClusterState(clusterId);
// 2. 计算升级所需资源
const allocation = calculateAllocation(currentState, upgradeVersion);
// 3. 写入分配计划到 BaaS
await baas.saveAllocationPlan(clusterId, allocation);
// 4. 发出下一个事件
await eventBus.emit('AllocationReady', {
clusterId,
allocation
});
return { status: 'success', allocation };
};
本章小结:
- Serverless 将基础设施抽象化,开发者聚焦业务逻辑。
- 事件驱动模型通过事件源、事件通道、事件处理器实现松耦合。
- FaaS 负责无状态计算逻辑,BaaS 提供有状态后端服务,二者互补。
- 在集群升级场景中,事件驱动架构使资源分配可拆解、可追踪、可回滚。