6.0 KiB
第11天:AWS Lambda——不用管服务器的计算
今天你将学到什么
今天学习一种全新的计算方式:无服务器(Serverless)。你不需要启动任何服务器,只需要写一段代码(函数),AWS 帮你运行。用一次付一次的钱,不用的时候一分钱不花。
什么是"无服务器"
"无服务器"这个名字容易让人误解——当然还是有服务器的,只是你不需要管理它。
传统方式(EC2): 你租了一台服务器 → 你要选配置、装系统、部署代码、打补丁、监控运行状态、处理故障...
无服务器方式(Lambda): 你写了一段代码 → 上传到 AWS → 有人触发时 AWS 自动运行 → 运行完毕自动释放
生活类比:
- EC2 像是你雇了一个全职员工:不管有没有活干,你都要付工资。他生病了你还得找人替班。
- Lambda 像是你叫了一个兼职:有活的时候叫他来干,干完就走,按小时付钱。没活的时候不花钱。
Lambda 怎么工作
Lambda 的执行单位是"函数"。一个函数就是一段代码,它的生命周期很简单:
某个事件发生 → 触发你的函数 → 函数执行 → 返回结果 → 结束
什么能触发 Lambda?
几乎 AWS 生态中的任何事件都能触发 Lambda:
| 触发源 | 场景举例 |
|---|---|
| 用户访问 API | 用户点击"提交订单",触发处理订单的函数 |
| 文件上传到 S3 | 用户上传了一张照片,自动触发压缩和生成缩略图 |
| 数据库数据变化 | 用户修改了个人资料,自动触发同步到搜索引擎 |
| 定时触发 | 每天凌晨 2 点自动生成报表 |
| 消息队列 | 有新订单消息进入队列,触发发货通知 |
一个具体的例子
场景:用户上传头像,需要自动生成三种尺寸的缩略图。
传统做法:
- 启动一台 EC2 服务器
- 安装图片处理软件
- 写一个程序持续监听上传事件
- 服务器 7×24 运行,即使没人上传也在空转
Lambda 做法:
- 写一个函数:接收图片 → 生成三种尺寸 → 保存回 S3
- 配置触发器:S3 有新文件上传时触发
- 完成!
有人上传时函数自动运行,没人上传时什么都不发生(也不花钱)。
Lambda 的计费方式
Lambda 的计费精确到不可思议:
按两个维度收费:
- 请求次数:每调用一次函数算一次请求
- 执行时长:函数运行了多长时间 × 分配了多少内存
免费额度(永久免费,不是 12 个月):
- 每月 100 万次请求免费
- 每月 40 万 GB-秒计算时间免费
这意味着什么?
假设你的函数:
- 分配 128MB 内存
- 每次执行 200 毫秒
- 每月调用 100 万次
计算:100万 × 0.2秒 × 0.125GB = 25,000 GB-秒
这完全在免费额度内。一分钱不花。
对于个人项目和小型应用,Lambda 几乎是免费的。
Lambda 的限制
Lambda 不是万能的,它有一些限制:
| 限制 | 值 | 意味着什么 |
|---|---|---|
| 最长运行时间 | 15 分钟 | 不能跑长时间任务 |
| 最大内存 | 10GB | 不能处理超大数据集 |
| 部署包大小 | 250MB(解压后) | 不能打包太多依赖 |
| 并发数 | 1000(默认) | 同时最多 1000 个函数在跑 |
Lambda 适合什么,不适合什么
非常适合 Lambda 的场景
- API 后端:用户请求来了处理一下返回结果(配合 API Gateway)
- 文件处理:图片压缩、视频转码、PDF 生成
- 定时任务:每天发报表、清理过期数据、健康检查
- 事件响应:用户注册后发欢迎邮件、订单创建后通知仓库
- 数据转换:从一个格式转成另一个格式
不适合 Lambda 的场景
- 长时间运行的任务:超过 15 分钟的任务(比如训练机器学习模型)
- 需要持续连接的服务:WebSocket 服务器、游戏服务器
- 高性能计算:需要 GPU 或大量 CPU 的任务
- 有状态的应用:需要在内存中保持数据的服务
Lambda vs EC2:什么时候用哪个
| 我的需求是... | 选择 |
|---|---|
| 处理偶尔的事件(每天几百次到几万次) | Lambda |
| 7×24 持续运行的服务 | EC2 |
| 不想管任何服务器 | Lambda |
| 需要完全控制运行环境 | EC2 |
| 运行时间可能超过 15 分钟 | EC2 |
| 流量极不稳定(有时 0,有时暴涨) | Lambda |
| 稳定的高流量 | EC2(更便宜) |
很多项目是混合使用的:
- 主要的 Web 服务跑在 EC2/ECS 上
- 后台的定时任务、文件处理用 Lambda
- 这样既有稳定性,又有灵活性
冷启动问题
Lambda 有一个需要了解的特性:冷启动。
当你的函数一段时间没被调用,AWS 会回收它的运行环境。下次调用时需要重新准备环境,这个过程叫"冷启动",会增加几百毫秒到几秒的延迟。
就像:你叫了一个兼职,如果他正好在附近(热启动),马上就能开始干活。如果他在家(冷启动),需要先赶过来。
解决方案:
- 对于大多数场景,几百毫秒的冷启动完全可以接受
- 如果对延迟要求极高,可以使用"预置并发"(Provisioned Concurrency)——提前准备好运行环境,但要额外付费
今天的小测验
- "无服务器"是不是真的没有服务器?这个名字的含义是什么?
- Lambda 的计费方式和 EC2 有什么本质区别?
- 举一个适合用 Lambda 的场景和一个不适合的场景。
- 什么是"冷启动"?它会造成什么影响?
延伸阅读
明天预告
明天进入存储领域:S3 对象存储。它是 AWS 最早的服务之一,也是用途最广的服务——从存网站图片到做大数据湖,几乎无处不在。