
English version GitHub: https://github.com/geekchow/aws-lambda-guide你在这里第 1 阶段 / 共 6 阶段Why。读完本文你将知道Lambda 出现之前痛在哪里、为什么虚拟机和容器没能根治以及哪些约束塑造了 Lambda 的设计——包括版本、别名和预置并发为什么必须存在。1. 之前的世界租下服务器就要背负它的一切问题想象 2012 年的 ShopFast。它的结账服务跑在负载均衡器后面的四台 EC2Elastic Compute Cloud弹性计算云虚拟机上。痛点具体表现为闲置付费凌晨 3 点的流量只有峰值的 2%但四台 VMVirtual Machine虚拟机全天候计费。典型利用率10–20%。容量靠猜黑五需要 20 倍容量、持续 6 小时。备少了 → 结账崩溃备多了 → 提前几周就开始烧钱。弹性迟缓自动扩缩组启动一台新 VM 需要数分钟。30 秒内冲到顶峰的流量尖刺援兵还没到就已结束。无差别苦活内核补丁、OSOperating System操作系统升级、日志代理、凌晨两点的磁盘写满告警——没有一件是结账业务逻辑。部署风险高部署 SSHSecure Shell安全外壳协议登录或在运行中的服务器上原地滚动更新。回滚意味着重新部署旧制品并祈祷它还能构建。2014 Lambda之后: 以函数为中心流量曲线按并发请求创建执行环境按请求数和毫秒计费平台打补丁扩缩你只发布版本之前: 以服务器为中心流量曲线按峰值配置固定机群80% 容量闲置照样付费自己打补丁、扩缩、原地部署图注Lambda 带来的转变——从给机群定规模变成让容量跟随并发请求。2. 为什么已有方案不够前辈方案解决了什么留下了什么问题物理服务器——上述全部问题外加数周的采购周期。VMEC2 自动扩缩从数周缩短到数分钟按小时/秒计费仍为闲置付费仍要给 OS 打补丁扩容需数分钟扩缩单位是整台 VM。容器ECSElastic Container Service弹性容器服务/Kubernetes启动更快、装箱更密、镜像不可变仍要运维集群节点、控制面、扩缩器原生不支持缩到零容量规划转移到节点池。PaaSPlatform as a Service平台即服务如 Heroku/Elastic Beanstalk无需给 OS 打补丁仍以长期运行的实例“dyno”为单位闲置实例照样计费。共同的局限容量单位是一台长期运行的服务器所以必须有人在需求到来之前决定保持多少台在运行。3. 塑造 Lambda 的约束要实现事件发生时才运行代码设计必须同时满足若干约束——每条约束都解释了你后面会遇到的一块 Lambda 设计约束在 Lambda 设计中的结果在哪里遇到按请求从零扩到数千容量单位 一个执行环境一次只服务一个请求并发是扩缩指标。05.4高密度下的强多租户隔离每个环境是一个 Firecracker microVMmicro Virtual Machine微虚拟机——虚拟机级隔离容器级启动速度。05.6按需创建环境要付出延迟于是有了冷启动。有些负载无法容忍 →预置并发预热的环境。05.3代码由平台代为运行必须可复现部署变成不可变版本代码 配置的精确冻结快照。05.1调用方不能每次部署都跟着改一个可以重新指向的稳定名字 →别名同时支撑金丝雀流量切换和秒级回滚。05.2失控的函数不能拖垮邻居账号级和函数级并发限额以 HTTPHypertext Transfer Protocol超文本传输协议429 限流。05.4只为实际运行付费以 GB-sGigabyte-secondGB 秒按 1 毫秒粒度计费外加按请求数计费。02 是什么4. 不存在就得有人发明它测试如果 Lambda 不存在而你要构建每个事件都运行我的代码、闲置时零成本你将被迫发明一个路由器接收事件并决定是否允许运行限额一个隔离沙箱池沙箱可以被找到热或被创建冷一种冻结运行哪份代码的方式让平台随时能创建出一模一样的沙箱版本一个稳定名字调用方一直用它而背后的代码可以变化别名一个预先创建沙箱的旋钮用于延迟敏感的路径预置并发。这份清单就是03 概念地图 的概念地图。结论痛点从来不是抽象的服务器很难而是容量必须在需求到来之前决定以及部署会修改正在运行的服务器。Lambda 用基于并发、按请求扩缩的微虚拟机回答第一点用可移动别名背后的不可变版本回答第二点。冷启动是第一个答案的代价预置并发是逃生通道。下一篇 →02 是什么 ·返回00 总览 返回专栏目录