一些历史

不久之前,开发,部署和运维还相当复杂。在一开始,运维不仅需要修补程序代码,还要支持物理机器。保持服务器,硬件与软件处于最新状态也是一项艰巨的任务。

在2000年代,一个新的模型——架构即服务(IaaS)很快流行起来。IaaS提供了从第三方租用远程服务器与虚拟机的可能性。这些提供商负责管理硬件,网络以及预留空间。

在IaaS出现之后,为开发者减负,让他们卸下所有非开发任务的想法推动了新方法,模型和服务的创新。

什么是容器?

Docker官方给出了如下简短而优雅的定义:“容器是一个标准软件单元,它将代码及其依赖打包到一起,因而应用可以快速稳定地运行在不同的计算环境中。”换句话来说,使用容器,开发者能确保应用能运行在任何云平台上或本地服务器上。在某些方面,容器与虚拟机相类似,都是独立的资源。然而,虚拟机模仿物理机,而容器创建了软件层的抽象。

什么是无服务器计算?

在无服务器计算中,整个应用或应用的一部分被分成多个功能,每个都会被一个事件触发,例如HTTP请求,新消息到达消息队列,或保存和修改数据。也能够在某个特定时间或周期性地执行,这个特性对计划任务很有用。

对于这样的系统,开发者只需要写功能代码,将它与它的依赖一起打包到一个压缩文件,并将压缩文件发到无服务的终端。供应商负责配置和扩展。

无服务器的一个关键特性是“即用即付”模型,企业只需要为他们功能的实际执行时间付费。如今,AWS Lambda是最流行的无服务器供应商。

容器与无服务器有共通之处吗?

是的!如今,无服务器与容器都很流行,因为他们能让开发者专注于代码而不是基础设施。这提高了开发速度。容器与无服务器都能与微服务及基于组件的开发完美契合。相对于经典的一体化架构,使用无服务与容器,开发部署都会更快,性价比也更高,因为你在操作应用的小部分,而不是整体。尽管有这些共性,两个技术都有各自的优劣以及各自的使用场景。

容器的优势

容器的第一大优势就是可移植性。由于容器包含了运行所需的一切依赖,只需要一个安装有容器引擎的机器就可以运行。容器是平台无关的,它可以运行在Linux, Windows, macOS, Mesos, Docker, Swarm, 或 Kubernetes,甚至可以运行在其他容器内部。

容器比虚拟机性能更好。虽然容器与虚拟机都是虚拟化的,虚拟机消耗更多的资源,因为他们运行着整个操作系统来模拟完整的机器。而容器可以共享同一个操作系统,这使它们更小,启停速度更快。

容器的另一个好处是运行开发者获得程序的完全控制。虽然这意味着系统设置必须手动配置,但这也意味着你拥有真正的灵活性。这一点无服务器是做不到的,因为几乎所有的管理都由云供应商负责。

容器的使用场景

如果你想重构一些大的一体化应用到微服务架构,并获得更好的性能,可测试性,以及扩展速度,容器非常有用。将过去的大应用分成几个小服务——一个负责用户管理,一个负责换媒体文件等等。每个服务都可以在负载提高时轻易地扩展来提供更好的性能。这些一体化应用就办不到,除非像整个系统添一个新实例,这样既不经济,又耗时间。

总的来说,容器适合于长期运行的程序,以及对系统有特殊要求的应用。

无服务器的优势

由于“即用即付”模式,使用无服务器的花费会大大降低。在应用的空闲时间你不必付费,因此如果没有流量,你就不用交月费。几乎所有的无服务供应商都有免费使用,包含一个按月的固定请求数和执行时间。通常提供的数值对一个小型网站来说已经足够了。

使用容器,将应用分成微服务是关键的一步。而使用无服务器,是将应用分成单个的功能,每个复杂一个特定的逻辑。这大大降低了开发和部署的速度,因为对于工程师来说这更容易理解。部署功能块也比部署整个应用所冒的风险更小。

无服务的另一个好处是爆发自动伸缩。无服务器的功能运行在小的,无状态的,短暂存在的容器中。供应商负责扩展应用来应对负载高峰,可以在几秒钟之内运行起来成百上千个实例。记住,你只需要为你的功能的执行时间付费。

什么时候使用无服务器?

事件驱动的无服务器对于那些不需要一直运行的应用很有用。

假设你在为一个已有应用开发一个媒体处理功能。新的模块不经常使用,但是也需要足够的计算能力完成它的任务。将它放在应用里需要迁移到一个性能更强的实例——一个冒险的举动,因为,如果一些繁重的任务一起运行,会给所有的用户带来延迟,这时你就需要性能更好的机器,而这同样会带来风险。

如果你选择无服务器,媒体处理模块会与应用的其余部分隔离。在不用时你不需要付费并且不会影响你程序的其余部分。

无服务器,不是你不需要服务器,而是供应商为你提供服务器,这个服务器在你用的时候就存在,不用的时候就不存在(不收费),这简直就是薛定谔的服务器。

容器的缺点

即使程序没人使用,也至少有一个承载容器的虚拟机实例在运行。因此,容器比无服务器更贵。

即使容器可以在共享的机器上快速扩展,额外扩展并不快,因为机器自身也需要扩展。不过,利用容器协调系统例如Kubernetes,AWS ECS...使扩展更容易。

无服务器的缺点

对于大部分开发者,最可怕的事是厂商绑定。使用无服务器,你不可避免地要选择一个云供应商,不同供应商之间使用的架构与API都不相同,如果要改变供应商或其他的解决方案,代价有些高昂。不过,也有一些专家不同意,声称厂商绑定不成问题。

使用无服务器,观测,监控与调试都不容易。因为程序可能被分成了多个部分,每一部分都有各自的bug与错误,掌控全局变得很重要。幸运的是,现在可以使用Thundra,一个为无服务器提供了完整可观测性的工具,聚合了性能指标和日志。

容器和无服务器可以一起使用吗?

令人惊讶的是,是的!让主程序功能作为容器化的微服务运行,而对于一些后台操作或很少使用但是消耗CPU的功能使用无服务器。

另一种又去的结合方式是使用AWS Fargate。这个服务结合了无服务器与容器的优点,运行你更好地控制你的程序而不用担心扩展——AWS负责。如果你对此感兴趣,查看关于AWS Fargate的这篇文章

总结

容器与无服务器通常被认为是相互竞争的技术。通过进一步的观察,发现他们只是不同的技术而已——在同一个项目中一起使用可以优势互补。记住“旧的”不意味着是“死的”,“新的”不代表“更好”。哪种方案有效取决于你的使用场合,项目需求,团队经验以及团队偏好。