1. Serverless 与事件驱动概述

1.1 Serverless 架构定义

Serverless(无服务器)并非真的没有服务器,而是将服务器基础设施的运维、容量规划、弹性伸缩等复杂性从开发者视角中抽象掉。开发者只需关注业务代码与数据,云平台负责执行环境的全生命周期管理。

核心特征:
  • 零运维:无需管理 OS、运行时、补丁、监控代理。
  • 按需付费:仅按实际执行次数与资源消耗计费,无空闲成本。
  • 自动弹性:从零到数千并发实例,平台自动扩缩。
  • 事件驱动:函数由外部事件触发执行,非持续运行。
Serverless 架构分层模型 用户层:API 网关 / 移动端 / Web 应用 / IoT 设备 事件源层:HTTP 请求 / 对象存储事件 / 消息队列 / 定时器 FaaS:函数即服务(业务逻辑) BaaS:后端即服务(数据/中间件) 云基础设施:Kubernetes / 容器 / 虚拟化 / 分布式存储

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 与 BaaS 在事件驱动中的协作 事件源 事件总线 FaaS 函数 升级检查 / 数据迁移 / 回滚 BaaS 服务 状态存储 / 配置管理 / 日志 协作模式 事件 → 函数(FaaS)→ 调用后端服务(BaaS)
常见误区: 不要把长时间运行的任务塞进 FaaS 函数。FaaS 通常有最大执行时长限制(如 15 分钟)。集群升级中的长耗时操作(如大规模数据迁移)应拆分为多个事件步骤,或委托给 BaaS 的异步任务服务处理。

1.4 事件驱动 Serverless 的典型工作流

以下是一个标准的事件驱动 Serverless 工作流示例,展示了 FaaS 与 BaaS 如何协同完成一次集群升级中的资源分配决策:

  1. 事件触发:集群升级计划发布,事件总线收到 UpgradeScheduled 事件。
  2. 函数执行:resource-allocator 函数被触发,读取当前集群资源快照(BaaS 存储)。
  3. 资源计算:函数根据升级策略计算所需预留资源,写入 AllocationPlan 表(BaaS)。
  4. 事件输出:函数发出 AllocationReady 事件,触发下一阶段函数执行。
  5. 状态持久化:每个步骤的状态变更自动记录到 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 提供有状态后端服务,二者互补。
  • 在集群升级场景中,事件驱动架构使资源分配可拆解、可追踪、可回滚。