名字的误导
Serverless 不是"没有服务器"——服务器当然存在,只是你不需要管理它。
更准确的理解:把服务器的运维责任交给云厂商,开发者只关心代码。
两种主要形态
一、FaaS(Function as a Service,函数即服务)
代表:AWS Lambda、Azure Functions、阿里云函数计算、腾讯云 SCF。
模式:
- 你上传一段函数代码;
- 配置触发器(HTTP 请求、消息队列事件、定时任务、文件上传等);
- 事件发生时,平台自动分配资源、运行你的函数、返回结果;
- 按实际运行时间和调用次数计费。
二、BaaS(Backend as a Service)
托管后端服务:数据库、对象存储、身份认证、消息队列等。
代表:Firebase、Supabase、云厂商的托管数据库服务。
核心特点
一、按需计费
传统服务器:无论有没有请求,都在运行,都在计费。
Serverless:空闲时不计费(或有极低的存储费用)。对于流量波动大、有大量空闲时段的应用,成本优势明显。
二、自动扩缩容
流量激增时,平台自动启动更多实例;流量下降时自动收缩。
三、无需运维
不用管理操作系统、打补丁、监控服务器健康、容量规划。
局限
一、冷启动(Cold Start)
如果一个函数长时间没被调用,平台可能回收其运行环境。下次调用时需要重新初始化——包括加载运行时、加载代码、建立连接。
延迟:从几十毫秒到数秒不等(取决于运行时、代码包大小、初始化逻辑)。
影响:对延迟敏感的应用(如同步 API)体验不佳。
缓解:
- 预置并发(Provisioned Concurrency):保持一定数量的实例常驻(但要付费,削弱了成本优势);
- 精简代码包和依赖;
- 选择启动快的运行时(如 Go、Rust 快于 Java)。
二、执行时间限制
多数平台对单次执行有超时限制(如 Lambda 最长 15 分钟)。
不适合:长时间运行的任务、需要保持长连接的场景。
三、无状态
函数实例是临时的、可被回收的。不能在内存中保存状态——状态必须存到外部(数据库、缓存、对象存储)。
四、本地状态与连接复用
虽然实例可能被复用("热"实例),但不能依赖这一点。
数据库连接是个典型问题:每个函数实例可能建立独立连接,流量大时连接数爆炸(需要用连接池或 RDS Proxy 一类的方案)。
五、厂商锁定
各家的 API、触发器、运行时支持都不同。迁移成本高。
六、调试与可观测性
本地调试相对困难(虽然有模拟工具),分布式追踪和日志需要专门配置。
七、成本不一定更低
对于持续高负载的应用,Serverless 可能比常驻服务器更贵。
简单估算:如果函数的运行时间占比超过一定比例(有说法是 50%–70%,取决于定价),包月服务器更划算。
适合什么
- 流量波动大、有明显波峰波谷的应用;
- 事件驱动的处理(图片/视频转码、文件处理、数据清洗);
- 定时任务(Cron);
- Webhook 处理;
- 原型验证和小项目(快速上线,无需运维);
- 流量不可预测的初创项目。
不适合:
- 长时间运行的计算;
- 延迟极度敏感的服务;
- 持续高负载的稳定服务;
- 需要精细控制底层环境的应用。
一个认知
Serverless 的核心价值不是"省钱",而是降低运维负担、加快交付速度、让资源与实际使用精确匹配。
对团队来说,它把"要不要为这个小功能单独部署一台服务器"的问题彻底消除了。
说明:本文为云计算的知识整理。