04 · AWS Lambda 贯穿示例:ShopFast 黑五一周的金丝雀发布、预置并发与限流

🇬🇧 English version | 📦 GitHub: https://github.com/geekchow/aws-lambda-guide

你在这里: 第 4 阶段 / 共 6 阶段(贯穿示例)。

读完本文你将知道: 后续每个文件都会回指的那个场景,以及每一步由哪个组件登场------仍不涉及内部细节。


三句话讲完场景

  1. 2026-11-26(周四) ,ShopFast 团队把优惠券功能作为 checkout 函数的版本 8 上线,通过金丝雀方式把 prod 别名从 v7 切到 v8(先 10% 持续 10 分钟,然后 100%)。
  2. 周五 09:00 开售前,他们把 prod 上的预置并发从 50 提到 400,让第一波顾客完全不会遇到冷启动。
  3. 09:05 一篇爆款帖子把流量推到预热池之外:多出的请求溢出 到冷的按需环境;在最顶峰,少数请求被函数的预留并发上限限流。

角色设定(全篇统一使用的事实)

项目 取值
账号 / Region 111122223333 / us-east-1
函数 checkout,Node.js 22 运行时,1,024 MB 内存,10 秒超时
调用方 API(Application Programming Interface,应用程序编程接口)Gateway REST API,集成 ARN(Amazon Resource Name,亚马逊资源名称)为 arn:aws:lambda:us-east-1:111122223333:function:checkout:prod
版本 v7(当前)、v8(新,含优惠券)
别名 prod → v7,PC(Provisioned Concurrency,预置并发)= 50
预留并发 800(checkout 既不会饿死其他函数,也不会被饿死)
平均时长 热调用 150 毫秒;冷启动 Init 约 600 毫秒
账号并发限额 3,000

我们跟踪三个具名请求:

请求 时间 结局
Alice 的结账 周四 14:05,金丝雀期间 落到 v8(那 10%),由一个热的 PC 环境服务
Bob 的结账 周五 09:05,爆款尖峰 PC 池满 → 溢出 → 在新的 v8 环境上冷启动
Carol 的结账 周五 09:06,最顶峰 达到预留并发 800 → 429 限流;API Gateway 返回错误,客户端重试

浅层追踪整个场景

本图回答:一周之内各组件按什么顺序登场?
#mermaid-svg-Of8qpDuEnxoQDwQ5{font-family:"trebuchet ms",verdana,arial,sans-serif;font-size:16px;fill:#333;}@keyframes edge-animation-frame{from{stroke-dashoffset:0;}}@keyframes dash{to{stroke-dashoffset:0;}}#mermaid-svg-Of8qpDuEnxoQDwQ5 .edge-animation-slow{stroke-dasharray:9,5!important;stroke-dashoffset:900;animation:dash 50s linear infinite;stroke-linecap:round;}#mermaid-svg-Of8qpDuEnxoQDwQ5 .edge-animation-fast{stroke-dasharray:9,5!important;stroke-dashoffset:900;animation:dash 20s linear infinite;stroke-linecap:round;}#mermaid-svg-Of8qpDuEnxoQDwQ5 .error-icon{fill:#552222;}#mermaid-svg-Of8qpDuEnxoQDwQ5 .error-text{fill:#552222;stroke:#552222;}#mermaid-svg-Of8qpDuEnxoQDwQ5 .edge-thickness-normal{stroke-width:1px;}#mermaid-svg-Of8qpDuEnxoQDwQ5 .edge-thickness-thick{stroke-width:3.5px;}#mermaid-svg-Of8qpDuEnxoQDwQ5 .edge-pattern-solid{stroke-dasharray:0;}#mermaid-svg-Of8qpDuEnxoQDwQ5 .edge-thickness-invisible{stroke-width:0;fill:none;}#mermaid-svg-Of8qpDuEnxoQDwQ5 .edge-pattern-dashed{stroke-dasharray:3;}#mermaid-svg-Of8qpDuEnxoQDwQ5 .edge-pattern-dotted{stroke-dasharray:2;}#mermaid-svg-Of8qpDuEnxoQDwQ5 .marker{fill:#333333;stroke:#333333;}#mermaid-svg-Of8qpDuEnxoQDwQ5 .marker.cross{stroke:#333333;}#mermaid-svg-Of8qpDuEnxoQDwQ5 svg{font-family:"trebuchet ms",verdana,arial,sans-serif;font-size:16px;}#mermaid-svg-Of8qpDuEnxoQDwQ5 p{margin:0;}#mermaid-svg-Of8qpDuEnxoQDwQ5 .label{font-family:"trebuchet ms",verdana,arial,sans-serif;color:#333;}#mermaid-svg-Of8qpDuEnxoQDwQ5 .cluster-label text{fill:#333;}#mermaid-svg-Of8qpDuEnxoQDwQ5 .cluster-label span{color:#333;}#mermaid-svg-Of8qpDuEnxoQDwQ5 .cluster-label span p{background-color:transparent;}#mermaid-svg-Of8qpDuEnxoQDwQ5 .label text,#mermaid-svg-Of8qpDuEnxoQDwQ5 span{fill:#333;color:#333;}#mermaid-svg-Of8qpDuEnxoQDwQ5 .node rect,#mermaid-svg-Of8qpDuEnxoQDwQ5 .node circle,#mermaid-svg-Of8qpDuEnxoQDwQ5 .node ellipse,#mermaid-svg-Of8qpDuEnxoQDwQ5 .node polygon,#mermaid-svg-Of8qpDuEnxoQDwQ5 .node path{fill:#ECECFF;stroke:#9370DB;stroke-width:1px;}#mermaid-svg-Of8qpDuEnxoQDwQ5 .rough-node .label text,#mermaid-svg-Of8qpDuEnxoQDwQ5 .node .label text,#mermaid-svg-Of8qpDuEnxoQDwQ5 .image-shape .label,#mermaid-svg-Of8qpDuEnxoQDwQ5 .icon-shape .label{text-anchor:middle;}#mermaid-svg-Of8qpDuEnxoQDwQ5 .node .katex path{fill:#000;stroke:#000;stroke-width:1px;}#mermaid-svg-Of8qpDuEnxoQDwQ5 .rough-node .label,#mermaid-svg-Of8qpDuEnxoQDwQ5 .node .label,#mermaid-svg-Of8qpDuEnxoQDwQ5 .image-shape .label,#mermaid-svg-Of8qpDuEnxoQDwQ5 .icon-shape .label{text-align:center;}#mermaid-svg-Of8qpDuEnxoQDwQ5 .node.clickable{cursor:pointer;}#mermaid-svg-Of8qpDuEnxoQDwQ5 .root .anchor path{fill:#333333!important;stroke-width:0;stroke:#333333;}#mermaid-svg-Of8qpDuEnxoQDwQ5 .arrowheadPath{fill:#333333;}#mermaid-svg-Of8qpDuEnxoQDwQ5 .edgePath .path{stroke:#333333;stroke-width:2.0px;}#mermaid-svg-Of8qpDuEnxoQDwQ5 .flowchart-link{stroke:#333333;fill:none;}#mermaid-svg-Of8qpDuEnxoQDwQ5 .edgeLabel{background-color:rgba(232,232,232, 0.8);text-align:center;}#mermaid-svg-Of8qpDuEnxoQDwQ5 .edgeLabel p{background-color:rgba(232,232,232, 0.8);}#mermaid-svg-Of8qpDuEnxoQDwQ5 .edgeLabel rect{opacity:0.5;background-color:rgba(232,232,232, 0.8);fill:rgba(232,232,232, 0.8);}#mermaid-svg-Of8qpDuEnxoQDwQ5 .labelBkg{background-color:rgba(232, 232, 232, 0.5);}#mermaid-svg-Of8qpDuEnxoQDwQ5 .cluster rect{fill:#ffffde;stroke:#aaaa33;stroke-width:1px;}#mermaid-svg-Of8qpDuEnxoQDwQ5 .cluster text{fill:#333;}#mermaid-svg-Of8qpDuEnxoQDwQ5 .cluster span{color:#333;}#mermaid-svg-Of8qpDuEnxoQDwQ5 div.mermaidTooltip{position:absolute;text-align:center;max-width:200px;padding:2px;font-family:"trebuchet ms",verdana,arial,sans-serif;font-size:12px;background:hsl(80, 100%, 96.2745098039%);border:1px solid #aaaa33;border-radius:2px;pointer-events:none;z-index:100;}#mermaid-svg-Of8qpDuEnxoQDwQ5 .flowchartTitleText{text-anchor:middle;font-size:18px;fill:#333;}#mermaid-svg-Of8qpDuEnxoQDwQ5 rect.text{fill:none;stroke-width:0;}#mermaid-svg-Of8qpDuEnxoQDwQ5 .icon-shape,#mermaid-svg-Of8qpDuEnxoQDwQ5 .image-shape{background-color:rgba(232,232,232, 0.8);text-align:center;}#mermaid-svg-Of8qpDuEnxoQDwQ5 .icon-shape p,#mermaid-svg-Of8qpDuEnxoQDwQ5 .image-shape p{background-color:rgba(232,232,232, 0.8);padding:2px;}#mermaid-svg-Of8qpDuEnxoQDwQ5 .icon-shape .label rect,#mermaid-svg-Of8qpDuEnxoQDwQ5 .image-shape .label rect{opacity:0.5;background-color:rgba(232,232,232, 0.8);fill:rgba(232,232,232, 0.8);}#mermaid-svg-Of8qpDuEnxoQDwQ5 .label-icon{display:inline-block;height:1em;overflow:visible;vertical-align:-0.125em;}#mermaid-svg-Of8qpDuEnxoQDwQ5 .node .label-icon path{fill:currentColor;stroke:revert;stroke-width:revert;}#mermaid-svg-Of8qpDuEnxoQDwQ5 :root{--mermaid-font-family:"trebuchet ms",verdana,arial,sans-serif;} 周五: 大促
08:30 自动扩缩

把 PC 设为 400
放置服务启动

400 个 v8 环境

运行 Init
09:00 2,000 RPS

300 并发: 全热
09:05 Bob: PC 满

溢出冷启动
09:06 Carol: 达上限

800, 429 限流
周四: 部署
CI 更新

$LATEST 代码
版本存储

发布 v8
别名 prod 变为

v7 90 / v8 10
PC 管理器把预热池

分给 v7 和 v8
Alice 请求路由到

v8 的热环境
告警安静:

prod = v8 100

图注:一周十步------每篇深入都锚定在这条主干上。

周四------部署 v8

  1. (T1--T2) CI/CD(Continuous Integration / Continuous Delivery,持续集成/持续交付)流水线把新 zip 上传到函数 的 $LATEST,然后调用 PublishVersion。版本存储 把代码 + 配置冻结为版本 8。
  2. (T3) CodeDeploy 更新别名 prod:主版本 v7,附加版本 v8 权重 0.10。API Gateway 的集成仍写着 checkout:prod------调用方毫无变化。
  3. (T4) 由于 prod 上配置了预置并发 ,PC 管理器 现在大致按权重比例同时为两个版本保持热环境。
  4. (T5) Alice 点击"支付"。API Gateway 调用 checkout:prod。调用前端 认证请求,别名路由 掷加权骰子 → v8。计数服务 确认 checkout 未超限。分配服务 找到一个空闲、已预初始化的 v8 执行环境,handler 约 150 毫秒完成。没有冷启动。
  5. (T6) 安静的十分钟后,CodeDeploy 把 prod 设为 v8 100%。(若错误飙升,它会把权重设回 0------秒级回滚。)

周五------大促

  1. (F1--F2) 08:30,Application Auto Scaling 中的计划任务把 prod 的 PC 提到 400。PC 管理器 请放置服务 创建 400 个 v8 环境;每个环境现在 就运行 Init 阶段,而不是在请求中运行。
  2. (F3) 09:00,2,000 RPS(Requests Per Second,每秒请求数)× 0.15 秒 ≈ 300 并发。每一个都落在热的 PC 环境上。
  3. (F4) 09:05,流量跳到约 4,500 RPS → 需要约 675 并发。400 个 PC 环境全忙;Bob 的请求被计数服务准入(675 < 800),但分配服务没有空闲环境,于是放置服务 新建一个按需 v8 环境。Bob 多等约 600 毫秒:一次冷启动 (一次溢出调用)。
  4. (F5) 09:06,需求瞬间达到约 850。Carol 的请求是第 801 个并发;计数服务 以 429 拒绝它。

每一步涉及的概念/组件

概念 / 组件 步骤
函数 / $LATEST 1
版本(版本存储) 1,以及之后所有"运行 v8"的步骤
别名(别名路由) 2、4、5
预置并发(PC 管理器 + 自动扩缩) 3、6、7、8
调用与并发(前端 + 计数) 4、7、8、9
分配 + 放置 4、6、8
执行环境 4、6、7、8

自测: 不往上翻,是谁拒绝了 Carol?为什么这不是 PC 管理器的职责?(答案:计数服务;因为 PC 从不限制流量------它只负责预热。)


下一篇 → 05.1 版本 · 返回 03 概念地图


📚 返回专栏目录

相关推荐
DolitD19 小时前
UE像素流与云渲染技术方案对比分析
3d·云原生·ue5·云计算·图形渲染
天府云创20 小时前
面向 Personal Agent 增强长期记忆与个性化能力,阿里云升级Memory 服务
阿里云·云计算·memory·agent智能体·长期记忆·personal agent
yunlaodacom1 天前
AWS亚马逊云代理商:WAF登录接口请求洪泛,限速阈值怎么设置?
云计算·aws
长不大的杨瑞杰1 天前
OpenCode v2 配置工程实战:Config 优先级、JSONC、变量替换与多环境治理
人工智能·安全·云计算·软件工程·devops
longzhizhui9261 天前
Ubuntu 全版本 CVE-2026-98432 内核安全升级操作手册
ubuntu·网络安全·云计算·bash
yunlaodacom1 天前
做异地灾备,华为云国际站 OBS 跨地域复制该怎么配置?
安全·华为云·云计算
Elastic 中国社区官方博客1 天前
AgentHack Shanghai|基于阿里云AI搜索 Elasticsearch x Qoder 构建AI Agent应用
大数据·人工智能·elasticsearch·搜索引擎·阿里云·云计算·全文检索
知已难寻2 天前
03 · OpenStack的计算管理 Nova
运维·服务器·开发语言·云原生·云计算·openstack·开源软件
会议咨询2 天前
2027年云计算、机电一体化与电子通信国际会议(CMEC 2027)
云计算·机电一体化·电子通信
云老大-阿里云国际站代理商2 天前
阿里云国际站服务代理商:CDN出现404,ECS源站正常怎么排查?
阿里云·云计算