01 · 为什么需要 AWS Lambda:闲置成本、容量规划与原地部署之痛

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

你在这里: 第 1 阶段 / 共 6 阶段(Why)。

读完本文你将知道: Lambda 出现之前痛在哪里、为什么虚拟机和容器没能根治,以及哪些约束塑造了 Lambda 的设计------包括版本、别名和预置并发为什么必须存在。


1. 之前的世界:租下服务器,就要背负它的一切问题

想象 2012 年的 ShopFast。它的结账服务跑在负载均衡器后面的四台 EC2(Elastic Compute Cloud,弹性计算云)虚拟机上。

痛点 具体表现
为闲置付费 凌晨 3 点的流量只有峰值的 2%,但四台 VM(Virtual Machine,虚拟机)全天候计费。典型利用率:10--20%。
容量靠猜 黑五需要 20 倍容量、持续 6 小时。备少了 → 结账崩溃;备多了 → 提前几周就开始烧钱。
弹性迟缓 自动扩缩组启动一台新 VM 需要数分钟。30 秒内冲到顶峰的流量尖刺,援兵还没到就已结束。
无差别苦活 内核补丁、OS(Operating System,操作系统)升级、日志代理、凌晨两点的磁盘写满告警------没有一件是结账业务逻辑。
部署风险高 部署 = SSH(Secure Shell,安全外壳协议)登录或在运行中的服务器上原地滚动更新。回滚意味着重新部署旧制品,并祈祷它还能构建。

#mermaid-svg-sw0QYpyAntn4YBOe{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-sw0QYpyAntn4YBOe .edge-animation-slow{stroke-dasharray:9,5!important;stroke-dashoffset:900;animation:dash 50s linear infinite;stroke-linecap:round;}#mermaid-svg-sw0QYpyAntn4YBOe .edge-animation-fast{stroke-dasharray:9,5!important;stroke-dashoffset:900;animation:dash 20s linear infinite;stroke-linecap:round;}#mermaid-svg-sw0QYpyAntn4YBOe .error-icon{fill:#552222;}#mermaid-svg-sw0QYpyAntn4YBOe .error-text{fill:#552222;stroke:#552222;}#mermaid-svg-sw0QYpyAntn4YBOe .edge-thickness-normal{stroke-width:1px;}#mermaid-svg-sw0QYpyAntn4YBOe .edge-thickness-thick{stroke-width:3.5px;}#mermaid-svg-sw0QYpyAntn4YBOe .edge-pattern-solid{stroke-dasharray:0;}#mermaid-svg-sw0QYpyAntn4YBOe .edge-thickness-invisible{stroke-width:0;fill:none;}#mermaid-svg-sw0QYpyAntn4YBOe .edge-pattern-dashed{stroke-dasharray:3;}#mermaid-svg-sw0QYpyAntn4YBOe .edge-pattern-dotted{stroke-dasharray:2;}#mermaid-svg-sw0QYpyAntn4YBOe .marker{fill:#333333;stroke:#333333;}#mermaid-svg-sw0QYpyAntn4YBOe .marker.cross{stroke:#333333;}#mermaid-svg-sw0QYpyAntn4YBOe svg{font-family:"trebuchet ms",verdana,arial,sans-serif;font-size:16px;}#mermaid-svg-sw0QYpyAntn4YBOe p{margin:0;}#mermaid-svg-sw0QYpyAntn4YBOe .label{font-family:"trebuchet ms",verdana,arial,sans-serif;color:#333;}#mermaid-svg-sw0QYpyAntn4YBOe .cluster-label text{fill:#333;}#mermaid-svg-sw0QYpyAntn4YBOe .cluster-label span{color:#333;}#mermaid-svg-sw0QYpyAntn4YBOe .cluster-label span p{background-color:transparent;}#mermaid-svg-sw0QYpyAntn4YBOe .label text,#mermaid-svg-sw0QYpyAntn4YBOe span{fill:#333;color:#333;}#mermaid-svg-sw0QYpyAntn4YBOe .node rect,#mermaid-svg-sw0QYpyAntn4YBOe .node circle,#mermaid-svg-sw0QYpyAntn4YBOe .node ellipse,#mermaid-svg-sw0QYpyAntn4YBOe .node polygon,#mermaid-svg-sw0QYpyAntn4YBOe .node path{fill:#ECECFF;stroke:#9370DB;stroke-width:1px;}#mermaid-svg-sw0QYpyAntn4YBOe .rough-node .label text,#mermaid-svg-sw0QYpyAntn4YBOe .node .label text,#mermaid-svg-sw0QYpyAntn4YBOe .image-shape .label,#mermaid-svg-sw0QYpyAntn4YBOe .icon-shape .label{text-anchor:middle;}#mermaid-svg-sw0QYpyAntn4YBOe .node .katex path{fill:#000;stroke:#000;stroke-width:1px;}#mermaid-svg-sw0QYpyAntn4YBOe .rough-node .label,#mermaid-svg-sw0QYpyAntn4YBOe .node .label,#mermaid-svg-sw0QYpyAntn4YBOe .image-shape .label,#mermaid-svg-sw0QYpyAntn4YBOe .icon-shape .label{text-align:center;}#mermaid-svg-sw0QYpyAntn4YBOe .node.clickable{cursor:pointer;}#mermaid-svg-sw0QYpyAntn4YBOe .root .anchor path{fill:#333333!important;stroke-width:0;stroke:#333333;}#mermaid-svg-sw0QYpyAntn4YBOe .arrowheadPath{fill:#333333;}#mermaid-svg-sw0QYpyAntn4YBOe .edgePath .path{stroke:#333333;stroke-width:2.0px;}#mermaid-svg-sw0QYpyAntn4YBOe .flowchart-link{stroke:#333333;fill:none;}#mermaid-svg-sw0QYpyAntn4YBOe .edgeLabel{background-color:rgba(232,232,232, 0.8);text-align:center;}#mermaid-svg-sw0QYpyAntn4YBOe .edgeLabel p{background-color:rgba(232,232,232, 0.8);}#mermaid-svg-sw0QYpyAntn4YBOe .edgeLabel rect{opacity:0.5;background-color:rgba(232,232,232, 0.8);fill:rgba(232,232,232, 0.8);}#mermaid-svg-sw0QYpyAntn4YBOe .labelBkg{background-color:rgba(232, 232, 232, 0.5);}#mermaid-svg-sw0QYpyAntn4YBOe .cluster rect{fill:#ffffde;stroke:#aaaa33;stroke-width:1px;}#mermaid-svg-sw0QYpyAntn4YBOe .cluster text{fill:#333;}#mermaid-svg-sw0QYpyAntn4YBOe .cluster span{color:#333;}#mermaid-svg-sw0QYpyAntn4YBOe 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-sw0QYpyAntn4YBOe .flowchartTitleText{text-anchor:middle;font-size:18px;fill:#333;}#mermaid-svg-sw0QYpyAntn4YBOe rect.text{fill:none;stroke-width:0;}#mermaid-svg-sw0QYpyAntn4YBOe .icon-shape,#mermaid-svg-sw0QYpyAntn4YBOe .image-shape{background-color:rgba(232,232,232, 0.8);text-align:center;}#mermaid-svg-sw0QYpyAntn4YBOe .icon-shape p,#mermaid-svg-sw0QYpyAntn4YBOe .image-shape p{background-color:rgba(232,232,232, 0.8);padding:2px;}#mermaid-svg-sw0QYpyAntn4YBOe .icon-shape .label rect,#mermaid-svg-sw0QYpyAntn4YBOe .image-shape .label rect{opacity:0.5;background-color:rgba(232,232,232, 0.8);fill:rgba(232,232,232, 0.8);}#mermaid-svg-sw0QYpyAntn4YBOe .label-icon{display:inline-block;height:1em;overflow:visible;vertical-align:-0.125em;}#mermaid-svg-sw0QYpyAntn4YBOe .node .label-icon path{fill:currentColor;stroke:revert;stroke-width:revert;}#mermaid-svg-sw0QYpyAntn4YBOe :root{--mermaid-font-family:"trebuchet ms",verdana,arial,sans-serif;} 2014 Lambda
之后: 以函数为中心
流量曲线
按并发请求

创建执行环境
按请求数和

毫秒计费
平台打补丁扩缩

你只发布版本
之前: 以服务器为中心
流量曲线
按峰值配置

固定机群
80% 容量闲置

照样付费
自己打补丁、

扩缩、原地部署

图注:Lambda 带来的转变------从"给机群定规模"变成"让容量跟随并发请求"。

2. 为什么已有方案不够

前辈方案 解决了什么 留下了什么问题
物理服务器 ------ 上述全部问题,外加数周的采购周期。
VM(EC2)+ 自动扩缩 从数周缩短到数分钟;按小时/秒计费 仍为闲置付费;仍要给 OS 打补丁;扩容需数分钟;扩缩单位是整台 VM。
容器(ECS(Elastic Container Service,弹性容器服务)/Kubernetes) 启动更快、装箱更密、镜像不可变 仍要运维集群(节点、控制面、扩缩器);原生不支持缩到零;容量规划转移到节点池。
PaaS(Platform as a Service,平台即服务,如 Heroku/Elastic Beanstalk) 无需给 OS 打补丁 仍以长期运行的实例("dyno")为单位;闲置实例照样计费。

共同的局限:容量单位是一台长期运行的服务器 ,所以必须有人在需求到来之前决定保持多少台在运行。

3. 塑造 Lambda 的约束

要实现"事件发生时才运行代码",设计必须同时满足若干约束------每条约束都解释了你后面会遇到的一块 Lambda 设计:

约束 在 Lambda 设计中的结果 在哪里遇到
按请求从零扩到数千 容量单位 = 一个执行环境 ,一次只服务一个请求;并发是扩缩指标。 05.4
高密度下的强多租户隔离 每个环境是一个 Firecracker microVM(micro Virtual Machine,微虚拟机)------虚拟机级隔离,容器级启动速度。 05.6
按需创建环境要付出延迟 于是有了冷启动 。有些负载无法容忍 → 预置并发(预热的环境)。 05.3
代码由平台代为运行,必须可复现 部署变成不可变版本:代码 + 配置的精确冻结快照。 05.1
调用方不能每次部署都跟着改 一个可以重新指向的稳定名字 → 别名,同时支撑金丝雀流量切换和秒级回滚。 05.2
失控的函数不能拖垮邻居 账号级和函数级并发限额,以 HTTP(Hypertext Transfer Protocol,超文本传输协议)429 限流。 05.4
只为实际运行付费 以 GB-s(Gigabyte-second,GB 秒)按 1 毫秒粒度计费,外加按请求数计费。 02 是什么

4. "不存在就得有人发明它"测试

如果 Lambda 不存在,而你要构建"每个事件都运行我的代码、闲置时零成本",你将被迫发明:

  1. 一个路由器:接收事件并决定是否允许运行(限额);
  2. 一个隔离沙箱池:沙箱可以被找到(热)或被创建(冷);
  3. 一种冻结"运行哪份代码"的方式,让平台随时能创建出一模一样的沙箱(版本);
  4. 一个稳定名字,调用方一直用它,而背后的代码可以变化(别名);
  5. 一个预先创建沙箱的旋钮,用于延迟敏感的路径(预置并发)。

这份清单就是 03 概念地图 的概念地图。

结论

痛点从来不是抽象的"服务器很难",而是容量必须在需求到来之前决定 ,以及部署会修改正在运行的服务器。Lambda 用基于并发、按请求扩缩的微虚拟机回答第一点,用"可移动别名背后的不可变版本"回答第二点。冷启动是第一个答案的代价;预置并发是逃生通道。


下一篇 → 02 是什么 · 返回 00 总览


📚 返回专栏目录

相关推荐
workflower3 小时前
AI+ 新型ICT 基础设施是企业数智化转型的基石
大数据·人工智能·机器学习·重构·云计算·汽车
Geek-Chow3 小时前
05.7 · AWS Lambda 连接数耗尽:CloudHSM 与数据库连接上限、RDS Proxy 及解法
云计算
Geek-Chow3 小时前
05.3 · AWS Lambda 预置并发(Provisioned Concurrency)详解:冷启动、溢出、自动扩缩与成本
云计算
m0_547486664 小时前
《云计算应用与实践》全套PPT课件2026
云计算·云计算应用
一颗小行星!4 小时前
阿里云也有Cloudflare Pages,免费建站成功!
阿里云·云计算
金融小师妹5 小时前
事件驱动分析模型:9月PPI超预期与美联储利率预期对黄金价格的影响
人工智能·云计算·线性回归·pyqt
无风听海6 小时前
一文读懂 AWS IAM:从工牌、钥匙到统一登录
云计算·aws
Geek-Chow18 小时前
02 · AWS Lambda 是什么:一句话定义、边界与生态位置
云计算
Joy T21 小时前
阿里云全栈部署 Skill:环境检查、版本适配、灰度发布与回滚实践
阿里云·云计算·部署·skills·ai能力接入·版本冲突