容器 vs Serverless:不是二选一,而是各取所长
容器和Serverless是两种不同的应用部署方式,各有优劣。本文通过对比分析,帮助开发者理解两种技术的适用场景,以及如何在实际项目中做出合理的选择。

容器 vs Serverless:不是二选一,而是各取所长
"我们应该用容器还是 Serverless?" 这是我被问得最多的技术选型问题之一。
我的回答通常是:这不是一个二选一的问题。容器和 Serverless 解决的是不同的问题,它们更像是锤子和螺丝刀的关系,而不是锤子和另一种锤子的关系。
两种抽象层次

容器和 Serverless 代表了两种不同的抽象层次。
容器的抽象层次是"操作系统"。你把应用和它的依赖打包成一个镜像,在任何支持容器的环境中运行。你仍然需要管理运行容器的主机、网络、存储,但不需要关心底层的操作系统和硬件。
Serverless 的抽象层次是"函数"或者"请求"。你只关心代码逻辑,不关心运行环境。平台自动处理扩容、负载均衡、故障恢复。你甚至不需要知道代码运行在哪台机器上。
抽象层次越高,你需要管理的东西越少,但你对底层的控制力也越弱。
容器的优势
容器的最大优势是控制力。你可以精确控制运行环境的每一个细节:操作系统版本、系统库版本、网络配置、存储挂载。这对于有特殊环境要求的应用来说是必需的。
容器的另一个优势是可移植性。一个容器镜像可以在本地开发机、测试环境、生产环境、不同的云平台上运行,行为完全一致。这解决了"在我机器上能跑"的经典问题。
长时间运行的服务是容器的甜蜜点。Web 服务器、数据库、消息队列,这些需要 7x24 运行的服务,容器是最合适的部署方式。
有状态应用也更适合容器。虽然 Serverless 可以连接外部数据库,但应用本身如果是无状态的,架构会更简单。有状态的应用(比如 WebSocket 服务器、游戏服务器)用容器部署更自然。
Serverless 的优势
Serverless 的最大优势是免运维。你不需要管理服务器、不需要配置扩容策略、不需要处理故障恢复。平台帮你搞定一切。
按需计费是另一个重要优势。没有请求时你不付钱,这对流量波动大的应用来说非常经济。一个白天忙晚上闲的 API,用 Serverless 比用容器节省大量成本。
自动扩缩容也是 Serverless 的亮点。从零到一万的并发请求,Serverless 平台自动处理。用容器实现同样的效果,需要配置 HPA、预热实例、设置合理的扩容阈值。
快速上线是 Serverless 的另一个优势。部署一个函数比部署一个容器简单得多。不需要写 Dockerfile,不需要配置 Kubernetes YAML,上传代码就能运行。
成本对比

成本是选型的重要考量因素,但不能简单地说哪个更便宜。
对于流量稳定的服务,容器通常更经济。你可以预留固定数量的容器实例,按月付费。Serverless 按请求计费,在高流量场景下可能比容器贵得多。
对于流量波动大的服务,Serverless 通常更经济。低谷期不付费,高峰期自动扩容。用容器的话,你需要按峰值流量配置资源,大部分时间资源是浪费的。
对于开发和测试环境,Serverless 通常更经济。这些环境的流量很低,按需计费比按实例计费便宜。
一个常见的策略是:生产环境的稳定流量用容器处理,突发流量用 Serverless 处理。这种混合方案能兼顾成本和性能。
开发体验对比
开发体验是另一个重要的对比维度。
容器的开发体验比较成熟。本地有 Docker,可以完全模拟生产环境。IDE 支持完善,调试工具丰富。但 Dockerfile 的编写和镜像的构建需要一定的学习成本。
Serverless 的开发体验在快速改善。很多平台提供了在线编辑器和一键部署功能。但本地开发和调试仍然是痛点。函数依赖平台的各种服务,本地很难完全模拟。
冷启动是 Serverless 开发体验的一大痛点。开发时频繁触发冷启动,等待时间让人焦虑。预热可以缓解,但增加了成本。
实际选型建议
基于以上分析,我给出以下选型建议。
选择容器的场景:长时间运行的服务、有状态应用、需要精确控制运行环境、流量稳定可预测、需要低延迟(无冷启动)。
选择 Serverless 的场景:事件驱动的任务、API 后端(流量波动大)、定时任务、快速原型开发、团队没有专门的运维人员。
混合使用的场景:核心服务用容器,辅助功能用 Serverless。比如主 API 用容器部署,图片处理、邮件发送、数据同步用 Serverless 实现。

我的判断
容器和 Serverless 的边界在模糊。容器平台在吸收 Serverless 的优点(比如自动扩容、按需计费),Serverless 平台在吸收容器的优点(比如更长的执行时间、更好的开发体验)。
长期来看,开发者不需要在容器和 Serverless 之间做痛苦的选择。平台会越来越智能,自动根据应用的特征选择最合适的运行方式。
对于当下的选型,我的建议是:不要被技术信仰左右,从你的实际需求出发。如果你的团队擅长容器、应用适合容器,就用容器。如果你的需求适合 Serverless、团队愿意接受它的局限,就用 Serverless。两者都用也完全可以。
务实的技术选型比任何"最佳实践"都更有价值。
