4. 流量采集挑战:并发请求的弹性伸缩、请求来源的不可预测性、API Gateway与函数之间的流量映射

在无服务器架构中,流量(Traffic)是衡量系统负载与用户体验的核心信号。然而,与传统的固定容量架构不同,无服务器环境的流量采集面临着三大独特挑战:并发请求的弹性伸缩、请求来源的不可预测性以及API Gateway与函数之间的流量映射。本节将深入剖析这些挑战,并提供可落地的采集策略。

4.1 并发请求的弹性伸缩:从“容量规划”到“并发配额”

传统架构中,流量采集通常基于固定实例数(如 N 台服务器)的 CPU/内存使用率。而在无服务器架构中,函数实例会从 0 弹性扩展到数千个并发实例。此时,请求速率(RPS) 和 并发执行数(Concurrent Executions) 成为衡量流量的关键指标。

核心指标定义:
  • 请求速率(RPS): 每秒到达 API Gateway 或触发函数的请求总数。反映入口流量压力。
  • 并发执行数: 在任意给定时刻,正在被函数实例处理的请求数量。反映系统当前的并行处理深度。
  • 并发配额: 云平台为每个 AWS 账户或区域设定的最大并发执行数上限(如 AWS Lambda 默认 1000)。

采集并发请求的挑战在于:弹性伸缩的滞后性与冷启动会导致流量瞬间尖刺被截断。例如,当 RPS 从 100 瞬间飙升至 10000 时,函数实例的创建速度可能跟不上请求到达速度,导致部分请求被限流(Throttling)。

采集建议: 除了采集 RPS 和并发数,务必采集 Throttles(限流次数) 和 并发配额使用率。使用 CloudWatch Metric Math 计算 (ConcurrentExecutions / ReservedConcurrency) * 100,以提前预警配额耗尽风险。
并发请求弹性伸缩与限流关系图 并发请求弹性伸缩与限流关系 请求入口 弹性伸缩层 实例池 0 → N 冷启动延迟 实例 1 实例 2 实例 N 限流 (Throttle) 采集要点: • 采集 RPS、并发执行数、Throttles 三个指标。• 监控并发配额使用率,设置 80% 告警阈值。

4.2 请求来源的不可预测性:从“固定客户端”到“万物互联”

无服务器架构的流量来源极其分散:Web 浏览器、移动 App、IoT 设备、定时触发器(CloudWatch Events)、消息队列(SQS)、事件总线(EventBridge)等。这种不可预测性给流量采集带来了两个难题:

  1. 来源标识困难: 不同来源的请求可能经过同一个 API Gateway 端点,但请求头、IP 段、User-Agent 差异巨大,难以统一归类。
  2. 流量模式碎片化: 用户行为驱动的流量(如电商秒杀)与后台事件驱动的流量(如 S3 文件上传处理)的峰值时段、并发特征完全不同。
请求来源类型 典型特征 采集难点 推荐采集维度
Web / 移动端 高 RPS,突发性强 需要区分用户会话 , User-Agent, 地理区域
IoT 设备 低 RPS,长连接,周期性 设备 ID 可能重复或缺失 设备 ID (X-Device-Id), 协议类型
事件驱动 (S3/SQS) 异步,批量到达 无直接 HTTP 上下文 事件源 ARN, 消息组 ID
定时触发器 固定周期,可预测 容易与其他流量混淆 触发器名称, Cron 表达式
常见陷阱: 不要仅依赖 IP 地址区分来源。在无服务器环境中,API Gateway 的源 IP 可能是 NAT 网关或 CloudFront 的 IP,无法反映真实客户端。应强制要求客户端在请求头中携带 X-Source-Type 或 X-Request-Id 等自定义标识。

4.3 API Gateway 与函数之间的流量映射:从“黑盒”到“可观测”

在无服务器架构中,API Gateway 是流量的第一入口,而函数是流量的最终处理单元。两者之间存在一个关键的映射断层:API Gateway 记录的指标(如 Count、4XXError、5XXError)与函数记录的指标(如 Invocations、Errors、Duration)在时间戳、请求 ID 和错误分类上往往不完全对齐。

这种断层会导致以下问题:

  • 错误归因困难: API Gateway 返回 502,但函数日志显示正常执行,实际是 Gateway 超时设置过短。
  • 流量丢失: API Gateway 统计到 1000 个请求,但函数只收到 950 个 Invocations,中间的 50 个请求可能在 Gateway 层被 WAF 拦截或限流。
  • 延迟拆分不准确: 无法区分“网络传输延迟”与“函数执行延迟”。
最佳实践:建立端到端流量映射
1. 在 API Gateway 阶段启用 详细 CloudWatch 日志,记录每个请求的 requestId 和 integrationLatency。
2. 在函数代码中,通过 context.awsRequestId 获取 AWS 内部请求 ID,并将其作为结构化日志的字段输出。
3. 使用 分布式追踪(如 AWS X-Ray 或 OpenTelemetry)将 API Gateway 的 Trace ID 透传到函数,实现请求级别的映射。
API Gateway 与函数流量映射架构 API Gateway 与函数流量映射架构 客户端 API Gateway 指标: Count, 4XX, 5XX Lambda 函数 指标: Invocations, Duration 断层 分布式追踪 (X-Ray / OpenTelemetry) 映射关键操作: 1. 在 API Gateway 日志中记录 requestId 和 integrationLatency。 2. 在函数日志中输出 awsRequestId 和 traceId。3. 通过 Trace ID 关联 Gateway 与函数指标。

4.4 流量采集的黄金指标清单

综合以上挑战,我们整理出一份针对无服务器架构流量采集的黄金指标清单。这些指标应作为可观测性平台的必选采集项:

指标名称 来源 采集粒度 告警阈值建议
RequestCount API Gateway 1 分钟 基于基线 + 200% 突发
ConcurrentExecutions Lambda 1 分钟 账户配额的 80%
Throttles Lambda 1 分钟 > 0 持续 5 分钟
IntegrationLatency API Gateway p50/p95/p99 p99 > 函数超时时间 * 0.8
4XXError / 5XXError API Gateway 1 分钟 错误率 > 1%
Invocations Lambda 1 分钟 与 RequestCount 偏差 > 5%
自动化采集脚本示例(AWS CLI + CloudWatch):
# 获取 API Gateway 请求计数
aws cloudwatch get-metric-statistics \
  --namespace AWS/ApiGateway \
  --metric-name Count \
  --dimensions Name=ApiName,Value=my-api \
  --start-time $(date -u -d '5 minutes ago' +%Y-%m-%dT%H:%M:%SZ) \
  --end-time $(date -u +%Y-%m-%dT%H:%M:%SZ) \
  --period 60 \
  --statistics Sum

# 获取 Lambda 并发执行数
aws cloudwatch get-metric-statistics \
  --namespace AWS/Lambda \
  --metric-name ConcurrentExecutions \
  --dimensions Name=FunctionName,Value=my-function \
  --start-time $(date -u -d '5 minutes ago' +%Y-%m-%dT%H:%M:%SZ) \
  --end-time $(date -u +%Y-%m-%dT%H:%M:%SZ) \
  --period 60 \
  --statistics Average

通过以上指标的组合分析,SRE 团队可以快速定位流量异常:例如,当 RequestCount 正常但 ConcurrentExecutions 飙升时,说明函数处理变慢(可能是代码性能问题或外部依赖延迟);当 Throttles 出现时,应立即检查并发配额并考虑启用预置并发(Provisioned Concurrency)。