简介
Serverless 计算已成为云架构中的热门话题。但与任何工具一样,它既有优势也有短板。在构建和维护多个 serverless 应用后,我总结出了它适合的场景与易产生问题的场景。本文分享这些经验教训。
Serverless 有益的场景
1. 事件驱动的工作负载
Serverless 在代码响应事件(文件上传、数据库变更、HTTP 请求)时表现优异。其按执行计费的模式意味着你无需为闲置时间付费。
// AWS Lambda handler for image resizing
exports.handler = async (event) => {
const bucket = event.Records[0].s3.bucket.name;
const key = event.Records[0].s3.object.key;
// resize and save
return { statusCode: 200 };
};
Enter fullscreen mode Exit fullscreen mode
2. 流量多变或不可预测
如果你的应用会出现偶发流量高峰(如营销活动),serverless 可即时自动扩展,无需预置峰值容量。
3. 快速原型与 MVP
你可以在几分钟内部署一个功能完整的 API,而无需管理服务器,从而加速反馈循环。
4. 微服务与胶水代码
Serverless 函数非常适合连接其他服务的小型、单一用途服务(例如处理 webhook、数据转换)。
Serverless 有害的场景
1. 长时间运行的进程
大多数云提供商都有最大执行超时限制(例如 AWS Lambda 为 15 分钟)。批处理或视频转码可能会触及此限制。
# This will timeout if processing takes > 15 minutes
def handler(event, context):
process_large_file(event['file'])
return {'done': True}
Enter fullscreen mode Exit fullscreen mode
2. 冷启动
在一段时间无活动后,首次请求可能会出现数秒的延迟,这对延迟敏感的应用(如同步 API)非常不利。
3. 有状态应用
Serverless 设计为无状态。如果需要持久连接(如 WebSocket)或本地状态,你必须借助 Redis 或 DynamoDB 等附加服务,增加复杂性。
4. 高而稳定的负载
如果你的服务 24/7 全天候运行且流量恒定,预置服务器通常更省钱。Serverless 的按调用计费成本可能会超过固定月租的服务器费用。
5. 复杂的调试与测试
本地模拟(例如 SAM、serverless-offline)有帮助,但永远无法完全复制生产环境。跨函数的分布式追踪调试会非常痛苦。
实践建议
适合使用 Serverless 的场景:
- 工作负载为事件驱动或间歇性
- 你希望尽量减少运维开销
- 你需要从零开始的快速扩展
不适合使用 Serverless 的场景:
- 存在长时间运行或有状态的进程
- 需要一致的低延迟(冷启动会造成影响)
- 流量恒定且量大
结论
Serverless 是一种强大的范式,但并非万能解药。在采用之前,请评估工作负载的特性。使用得当,它能降低复杂度和成本;使用不当,则会带来新问题。请明智选择。
0 Comments
Log in to join the conversation.No comments yet. Be the first to share your thoughts.