177 lines
6.0 KiB
Markdown
177 lines
6.0 KiB
Markdown
# 第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 的计费精确到不可思议:
|
||
|
||
**按两个维度收费**:
|
||
1. **请求次数**:每调用一次函数算一次请求
|
||
2. **执行时长**:函数运行了多长时间 × 分配了多少内存
|
||
|
||
**免费额度(永久免费,不是 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)——提前准备好运行环境,但要额外付费
|
||
|
||
---
|
||
|
||
## 今天的小测验
|
||
|
||
1. "无服务器"是不是真的没有服务器?这个名字的含义是什么?
|
||
2. Lambda 的计费方式和 EC2 有什么本质区别?
|
||
3. 举一个适合用 Lambda 的场景和一个不适合的场景。
|
||
4. 什么是"冷启动"?它会造成什么影响?
|
||
|
||
---
|
||
|
||
## 延伸阅读
|
||
|
||
- [Lambda 开发者指南](https://docs.aws.amazon.com/lambda/latest/dg/welcome.html)
|
||
- [Serverless Land — 模式和示例](https://serverlessland.com/)
|
||
- [Lambda 定价计算器](https://aws.amazon.com/lambda/pricing/)
|
||
|
||
---
|
||
|
||
## 明天预告
|
||
|
||
明天进入存储领域:S3 对象存储。它是 AWS 最早的服务之一,也是用途最广的服务——从存网站图片到做大数据湖,几乎无处不在。
|