1、Serverless初探:什么是Serverless、Serverless与传统架构对比、核心价值与适用场景
1.1 到底什么是Serverless?
说实话,我第一次听到「Serverless」这个词,第一反应是:不用服务器了?那代码跑哪儿去?
嗯,这名字确实有点误导人。Serverless 不是说没有服务器,而是说你不用关心服务器。你只管写代码,至于它跑在哪台机器上、怎么扩容、怎么保证高可用——这些脏活累活,云平台替你干了。
我习惯把 Serverless 拆成两部分理解:
- FaaS(函数即服务):你上传一段代码,比如一个 Python 函数,云平台帮你运行它。按调用次数收费,不调用不收钱。
- BaaS(后端即服务):数据库、对象存储、认证服务这些后端能力,直接用云平台提供的,不用自己搭。
说白了,Serverless 就是一种「你只管业务逻辑,基础设施我包了」的架构模式。
核心定义:Serverless 是一种云原生开发模型,开发者只需编写和部署代码,云服务商自动管理服务器资源分配、弹性伸缩和运维。
1.2 传统架构 vs Serverless:一张表看懂
我在给团队做技术选型时,经常被问到:「Serverless 到底比传统架构好在哪儿?」
我的回答是:不是谁替代谁,而是看场景。但为了让你有个直观感受,我列个对比表:
| 对比维度 | 传统架构(虚拟机/容器) | Serverless 架构 |
|---|---|---|
| 运维成本 | 需要自己管理 OS、补丁、监控 | 全托管,零运维 |
| 弹性伸缩 | 手动或自动,但需要提前规划 | 自动伸缩,从 0 到无限 |
| 计费方式 | 按资源占用(按时/按月) | 按实际执行次数和时长 |
| 冷启动 | 无此问题(服务常驻) | 有冷启动延迟(约 100ms-1s) |
| 适合场景 | 长运行、高负载、延迟敏感 | 事件驱动、间歇性、短任务 |
| 调试难度 | 本地可完整模拟 | 依赖云环境,本地调试较麻烦 |
你想想看,传统架构就像你租了个房子,不管住不住都得付房租。Serverless 就像住酒店,按天算钱,退房就走人。
1.3 核心价值:为什么越来越多团队转向 Serverless?
我参与过好几个从传统架构迁移到 Serverless 的项目,总结下来,核心价值就三点:
1.3.1 降低运维负担
我记得有一次,团队负责一个内部工具,流量很不稳定。白天上班时间几百人用,晚上几乎没人。用传统架构,你得一直开着服务器,浪费钱。用 Serverless,晚上没人用的时候,费用直接降到零。
说白了,你不用再半夜爬起来处理服务器告警了。云平台帮你搞定一切。
1.3.2 弹性伸缩是默认能力
传统架构下,你要考虑「万一流量暴增怎么办?」——加机器、配负载均衡、搞限流。Serverless 呢?自动扩缩容,从 0 到 1000 个并发,几秒钟完成。
我曾经遇到过一个场景:某个营销活动上线,流量瞬间涨了 50 倍。传统架构下,我们手忙脚乱地扩容,还是挂了半小时。后来用 Serverless 重写,同样的流量,稳如老狗。
1.3.3 按需付费,成本可控
这个很好理解。你写了一个图片处理函数,每天只被调用 100 次。传统架构下,你得租一台服务器,一个月几百块。Serverless 呢?可能一个月就花几块钱。
我的建议:如果你的应用流量波动大、或者处于早期阶段不确定用户量,Serverless 是绝佳选择。成本低,试错成本也低。
1.4 适用场景:什么时候该用 Serverless?
不是所有场景都适合 Serverless。我踩过坑,也见过别人踩坑。下面是我总结的最佳实践:
✅ 适合的场景
- Web API / 微服务:尤其是轻量级的 REST API,用 API Gateway + Lambda 组合,开发效率极高。
- 数据处理管道:比如图片上传后自动压缩、视频转码、日志分析。事件驱动,天然匹配。
- 定时任务 / 批处理:每天凌晨跑一次报表,用 Serverless 比租一台服务器划算得多。
- Chatbot / Webhook:消息量不确定,Serverless 的弹性伸缩完美适配。
- IoT 后端:设备上报数据,触发函数处理,按需付费。
❌ 不适合的场景
- 长连接 / WebSocket:Serverless 函数有超时限制(通常 15 分钟),不适合长时间保持连接。
- 高计算密集型任务:比如机器学习模型训练,跑几个小时那种,Serverless 成本反而更高。
- 延迟极其敏感的应用:比如高频交易,冷启动那几百毫秒可能就是灾难。
- 有状态应用:Serverless 函数是无状态的,每次调用都是全新环境。如果你需要保存状态,得借助外部存储。
避坑指南:我曾经把一个需要大量本地缓存的应用直接搬到 Serverless 上,结果性能惨不忍睹。后来才意识到,Serverless 不适合有状态的应用。如果你需要缓存,请用 Redis 或 Memcached 这类外部服务。
1.5 一个简单的例子:用 Serverless 写个图片缩略图服务
光说不练假把式。我写个最简单的例子,让你感受一下 Serverless 的开发体验。
假设我们有一个图片上传到 S3 存储桶,自动生成缩略图。用 AWS Lambda + Python 实现:
import boto3
from PIL import Image
import io
s3 = boto3.client('s3')
def lambda_handler(event, context):
# 获取上传的图片信息
bucket = event['Records'][0]['s3']['bucket']['name']
key = event['Records'][0]['s3']['object']['key']
# 下载原图
response = s3.get_object(Bucket=bucket, Key=key)
image = Image.open(io.BytesIO(response['Body'].read()))
# 生成缩略图
image.thumbnail((200, 200))
# 保存到另一个桶
thumbnail_key = 'thumbnails/' + key
buffer = io.BytesIO()
image.save(buffer, 'JPEG')
buffer.seek(0)
s3.put_object(
Bucket='my-thumbnails-bucket',
Key=thumbnail_key,
Body=buffer,
ContentType='image/jpeg'
)
return {
'statusCode': 200,
'body': f'Thumbnail created: {thumbnail_key}'
}
你看,整个代码不到 30 行。没有服务器配置,没有 Nginx,没有 Dockerfile。上传代码,配置触发器,完事。
这就是 Serverless 的魅力——把精力花在业务逻辑上,而不是基础设施上。
1.6 小结
这一章我们聊了:
- Serverless 不是没有服务器,而是你不用管服务器
- 与传统架构相比,运维成本低、弹性好、按需付费
- 适合事件驱动、间歇性任务;不适合长连接、高计算、有状态应用
- 一个简单的图片缩略图例子,展示了 Serverless 的开发效率
下一章,我会带你深入 Serverless 的核心——函数计算(FaaS)的原理与实践。到时候我会分享一些我在生产环境中遇到的坑和解决方案。
嗯,先消化这些吧。有问题随时问我。