扩展与并发控制

使用 AWS Lambda 构建无服务器应用

Claudio Canales

Senior DevOps Engineer

一图看扩展

  • 需求越高 -> 并行运行越多。
  • 每次运行占用一个执行环境。
  • 并发 = 当前正在运行的数量。

需求激增 -> 更多环境

使用 AWS Lambda 构建无服务器应用

什么是并发?

  • 一次调用 = 一个工作单元。
  • 并发 = 现在在跑多少个。
  • 若有 10 个在跑,并发 = 10。

并行调用

使用 AWS Lambda 构建无服务器应用

估算所需并发

  • 经验公式:concurrency = rps * duration
  • 降低时长可降低并发。
  • 用此安全设定上限。

并发公式

使用 AWS Lambda 构建无服务器应用

示例:50 rps、200 ms

  • 200 ms = 0.2 秒。
  • 50 * 0.2 = 10 个并发执行。
  • 代码越快,并行数越少。

并发计算示例

使用 AWS Lambda 构建无服务器应用

限制:账户池 vs 函数切片

  • 并发在账户级受限。
  • 为关键函数预留部分配额。
  • 其余函数共享剩余。

账户并发池

使用 AWS Lambda 构建无服务器应用

预留并发:硬性上限

  • 安全阀。
  • 限制并行工作量。
  • 超过上限将被限流。
  • 吵闹的函数不会耗尽容量。

预留并发上限

使用 AWS Lambda 构建无服务器应用

限流:表象

  • Lambda 在并发上限处限流。
  • 调用方无法获得正常执行。
  • 监控中可看到限流。

限流信号

使用 AWS Lambda 构建无服务器应用

预置并发:预热容量

  • 预初始化环境池。
  • 常挂在别名后。
  • 请求启动更快。

预置并发的热池

使用 AWS Lambda 构建无服务器应用

冷启动 vs 预置

冷启动

  • 一次性初始化延迟。
  • 首个请求承担初始化成本。

预置

  • 初始化预先完成。
  • 首个请求不再付初始化成本。

冷启动 vs 预置 时间线

使用 AWS Lambda 构建无服务器应用

预留 vs 预置(不同问题)

  • 预留用于控制负载。
  • 预置用于控制启动时延。
  • 许多生产函数两者并用。

预留 vs 预置 对比

使用 AWS Lambda 构建无服务器应用

保护下游系统

  • 数据库能承载的连接有限。
  • 并发上限可防止超载。
  • 否则流量尖峰可能引发故障。

并发上限保护数据库

使用 AWS Lambda 构建无服务器应用

突发 vs 稳定流量

  • 突发会创建大量并行环境。
  • 处理器慢会维持高并发。
  • 上限可平滑尖峰。
  • 缩短时长也是扩展策略。

突发流量 vs 稳态

使用 AWS Lambda 构建无服务器应用

故障与重试会增大负载

  • 重试会放大量。
  • 并发上限可缩小影响面。
  • 失败循环会压垮依赖。

重试放大负载

使用 AWS Lambda 构建无服务器应用

简单调优流程

  • 先做测量。
  • 出现限流或压力时设并发上限。
  • 冷启动影响延迟时加预置容量。

测量 -> 设上限 -> 预热

使用 AWS Lambda 构建无服务器应用

要点回顾

  • 并发有助于思考扩展。
  • 估算:rps * duration
  • 预留用于限载;关注限流。
  • 预置可降低冷启动延迟。

并发要点

使用 AWS Lambda 构建无服务器应用

¡Vamos a practicar!

使用 AWS Lambda 构建无服务器应用

Preparing Video For Download...