toc 目录

管理员 - 1

Object2
Object2 摆烂中
tagHome
arrow_back返回
Object2

容器 vs Serverless:不是二选一,而是各取所长

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

容器 vs Serverless:不是二选一,而是各取所长

容器 vs Serverless:不是二选一,而是各取所长

"我们应该用容器还是 Serverless?" 这是我被问得最多的技术选型问题之一。

我的回答通常是:这不是一个二选一的问题。容器和 Serverless 解决的是不同的问题,它们更像是锤子和螺丝刀的关系,而不是锤子和另一种锤子的关系。

两种抽象层次

DevOps automation pipeline

容器和 Serverless 代表了两种不同的抽象层次。

容器的抽象层次是"操作系统"。你把应用和它的依赖打包成一个镜像,在任何支持容器的环境中运行。你仍然需要管理运行容器的主机、网络、存储,但不需要关心底层的操作系统和硬件。

Serverless 的抽象层次是"函数"或者"请求"。你只关心代码逻辑,不关心运行环境。平台自动处理扩容、负载均衡、故障恢复。你甚至不需要知道代码运行在哪台机器上。

抽象层次越高,你需要管理的东西越少,但你对底层的控制力也越弱。

容器的优势

容器的最大优势是控制力。你可以精确控制运行环境的每一个细节:操作系统版本、系统库版本、网络配置、存储挂载。这对于有特殊环境要求的应用来说是必需的。

容器的另一个优势是可移植性。一个容器镜像可以在本地开发机、测试环境、生产环境、不同的云平台上运行,行为完全一致。这解决了"在我机器上能跑"的经典问题。

长时间运行的服务是容器的甜蜜点。Web 服务器、数据库、消息队列,这些需要 7x24 运行的服务,容器是最合适的部署方式。

有状态应用也更适合容器。虽然 Serverless 可以连接外部数据库,但应用本身如果是无状态的,架构会更简单。有状态的应用(比如 WebSocket 服务器、游戏服务器)用容器部署更自然。

Serverless 的优势

Serverless 的最大优势是免运维。你不需要管理服务器、不需要配置扩容策略、不需要处理故障恢复。平台帮你搞定一切。

按需计费是另一个重要优势。没有请求时你不付钱,这对流量波动大的应用来说非常经济。一个白天忙晚上闲的 API,用 Serverless 比用容器节省大量成本。

自动扩缩容也是 Serverless 的亮点。从零到一万的并发请求,Serverless 平台自动处理。用容器实现同样的效果,需要配置 HPA、预热实例、设置合理的扩容阈值。

快速上线是 Serverless 的另一个优势。部署一个函数比部署一个容器简单得多。不需要写 Dockerfile,不需要配置 Kubernetes YAML,上传代码就能运行。

成本对比

CI/CD deployment workflow

成本是选型的重要考量因素,但不能简单地说哪个更便宜。

对于流量稳定的服务,容器通常更经济。你可以预留固定数量的容器实例,按月付费。Serverless 按请求计费,在高流量场景下可能比容器贵得多。

对于流量波动大的服务,Serverless 通常更经济。低谷期不付费,高峰期自动扩容。用容器的话,你需要按峰值流量配置资源,大部分时间资源是浪费的。

对于开发和测试环境,Serverless 通常更经济。这些环境的流量很低,按需计费比按实例计费便宜。

一个常见的策略是:生产环境的稳定流量用容器处理,突发流量用 Serverless 处理。这种混合方案能兼顾成本和性能。

开发体验对比

开发体验是另一个重要的对比维度。

容器的开发体验比较成熟。本地有 Docker,可以完全模拟生产环境。IDE 支持完善,调试工具丰富。但 Dockerfile 的编写和镜像的构建需要一定的学习成本。

Serverless 的开发体验在快速改善。很多平台提供了在线编辑器和一键部署功能。但本地开发和调试仍然是痛点。函数依赖平台的各种服务,本地很难完全模拟。

冷启动是 Serverless 开发体验的一大痛点。开发时频繁触发冷启动,等待时间让人焦虑。预热可以缓解,但增加了成本。

实际选型建议

基于以上分析,我给出以下选型建议。

选择容器的场景:长时间运行的服务、有状态应用、需要精确控制运行环境、流量稳定可预测、需要低延迟(无冷启动)。

选择 Serverless 的场景:事件驱动的任务、API 后端(流量波动大)、定时任务、快速原型开发、团队没有专门的运维人员。

混合使用的场景:核心服务用容器,辅助功能用 Serverless。比如主 API 用容器部署,图片处理、邮件发送、数据同步用 Serverless 实现。

Infrastructure as code

我的判断

容器和 Serverless 的边界在模糊。容器平台在吸收 Serverless 的优点(比如自动扩容、按需计费),Serverless 平台在吸收容器的优点(比如更长的执行时间、更好的开发体验)。

长期来看,开发者不需要在容器和 Serverless 之间做痛苦的选择。平台会越来越智能,自动根据应用的特征选择最合适的运行方式。

对于当下的选型,我的建议是:不要被技术信仰左右,从你的实际需求出发。如果你的团队擅长容器、应用适合容器,就用容器。如果你的需求适合 Serverless、团队愿意接受它的局限,就用 Serverless。两者都用也完全可以。

务实的技术选型比任何"最佳实践"都更有价值。

吉祥物