3. Serverless 平台架构:函数计算、API 网关、事件驱动、弹性伸缩核心组件

Serverless 平台并非单一产品,而是由多个核心组件协同构成的分布式系统。理解这些组件的职责与交互关系,是设计灰度发布、弹性伸缩与日志留痕方案的基础。本章聚焦四大核心组件:函数计算(FaaS)、API 网关(API Gateway)、事件驱动(Event-Driven)与弹性伸缩(Auto Scaling),并剖析其在发布流水线中的关键作用。

3.1 核心组件架构总览

下图展示了 Serverless 平台的核心组件及其在请求生命周期中的协作关系。从客户端请求到函数执行,再到日志持久化,每个组件都承担着不可替代的职责。

Serverless 核心组件架构图 Serverless 核心组件架构图 客户端 API 网关 事件源 事件总线 函数计算 (FaaS 运行时) 弹性伸缩 日志服务 架构要点: • 请求路径:客户端 → API 网关 → 函数计算 → 日志服务(同步调用) • 事件路径:事件源 → 事件总线 → 函数计算 → 日志服务(异步调用) • 弹性伸缩组件实时监控函数计算负载,动态调整并发实例数

3.2 函数计算(FaaS)—— 执行核心

函数计算是 Serverless 平台的计算载体,负责运行用户代码。在灰度发布场景中,函数计算需要支持版本管理与别名路由,以实现流量在不同版本间的精确分配。

特性 说明 灰度发布中的作用
版本(Version) 函数代码与配置的不可变快照 每个灰度批次对应一个版本,支持回滚
别名(Alias) 指向一个或多个版本的指针,支持权重路由 实现灰度流量按比例分发(如 10% → 50% → 100%)
并发实例 函数同时运行的实例数,受弹性伸缩控制 灰度期间需预留实例,避免冷启动影响体验
运行时沙箱 每个实例运行在独立的容器/沙箱中 灰度版本与稳定版本隔离,互不干扰

灰度发布关键配置示例:通过别名将 10% 流量指向新版本 v2,90% 指向稳定版本 v1。

# 创建别名 prod,指向 v1(权重 90%)和 v2(权重 10%)
aliyun fc CreateAlias --serviceName myService --functionName myFunc \
  --aliasName prod \
  --versionId "v1" \
  --additionalVersionWeight '{"v2": 0.1}'

3.3 API 网关 —— 流量入口与路由

API 网关是外部请求进入 Serverless 平台的统一入口。在灰度发布流水线中,API 网关承担着流量分发、请求过滤与灰度标签透传的职责。

  • 路由规则:根据请求路径、Header、Query 参数将请求路由到不同函数或别名。
  • 灰度策略:支持基于 Header(如 x-canary: true)或 Cookie 的灰度路由,实现用户维度的灰度。
  • 限流熔断:灰度期间若新版本出现异常,网关可快速熔断,保护下游函数。
  • 日志透传:在请求 Header 中注入灰度批次 ID、traceId,便于日志关联。

最佳实践:在 API 网关层配置灰度 Header 白名单,确保灰度流量只对指定测试用户生效,避免影响全量用户。

3.4 事件驱动 —— 异步解耦与触发

事件驱动是 Serverless 平台的异步处理核心。在发布流水线中,事件驱动机制用于异步灰度验证、日志采集与伸缩事件通知。

事件源 触发场景 灰度发布关联
对象存储(OSS) 文件上传/删除 灰度版本处理新格式文件,验证兼容性
消息队列(MNS/Kafka) 异步消息处理 灰度批次消费特定 Topic,隔离消息流
定时触发器 定时任务 灰度版本在低峰期执行,降低影响面
日志服务(SLS) 日志消费与投递 灰度日志实时投递到分析平台,用于监控

3.5 弹性伸缩 —— 动态资源保障

弹性伸缩是 Serverless 平台应对流量波动的关键能力。在灰度发布过程中,弹性伸缩需要同时处理新旧版本的并发实例,确保灰度批次不会因资源不足而失败。

弹性伸缩策略对比图 弹性伸缩策略对比图 按并发请求数伸缩 根据当前并发实例数 / 最大并发阈值 实时调整实例数量 按资源利用率伸缩 监控 CPU、内存使用率 超过阈值时扩容实例 预留实例预热 灰度发布前预置 N 个实例 避免冷启动影响灰度体验 灰度发布中的伸缩策略建议: 1. 灰度批次启动前:调用预留实例 API,为灰度版本预热 5~10 个实例。 2. 灰度批次执行中:启用按并发伸缩,设置最大并发数(如 100),防止雪崩。 3. 灰度批次完成后:释放预留实例,恢复默认伸缩策略,节省成本。

3.6 组件协作:灰度发布流水线中的交互

在灰度发布流水线中,四大组件通过以下协作流程完成一次灰度批次部署:

  1. 触发灰度:CI/CD 系统调用 API 网关,创建函数别名并设置灰度权重。
  2. 预热实例:弹性伸缩组件根据灰度批次配置,为灰度版本预留指定数量的实例。
  3. 路由流量:API 网关根据灰度策略(权重/Header),将部分请求路由到灰度版本。
  4. 执行函数:函数计算运行灰度版本代码,并将执行日志、指标发送到日志服务。
  5. 事件通知:灰度版本处理完成后,通过事件总线发送完成事件,触发下一批次或回滚。
  6. 伸缩调整:弹性伸缩根据实时指标调整灰度版本实例数,确保响应时间达标。

注意:在组件协作中,日志留痕必须贯穿全流程。每个组件(API 网关、函数计算、弹性伸缩)都需输出结构化日志,包含灰度批次 ID、版本号、实例 ID、时间戳,以便在出现问题时快速定位故障点。

3.7 组件对比与选型建议

组件 核心职责 灰度发布关键能力 日志留痕要点
函数计算 代码执行与版本管理 别名路由、版本隔离、并发控制 函数执行日志、版本号、实例 ID
API 网关 流量入口与路由分发 灰度 Header 路由、限流熔断 请求日志、灰度标签、响应状态
事件驱动 异步解耦与事件触发 事件过滤、灰度 Topic 隔离 事件 ID、触发时间、处理结果
弹性伸缩 动态资源调整 预留实例、并发阈值、伸缩策略 伸缩事件、实例数变化、原因