无服务器计算和容器都是减少云主机Web应用程序开销的体系结构,但是它们在几个重要方面有所不同。容器比虚拟机更轻便,但是无服务器部署比基于容器的架构更轻便且易于扩展。
阅读本文后,您将能够:
复制文章链接
与传统服务器或虚拟机上托管的应用程序相比,无服务器计算和容器都使开发人员能够以更少的开销和更大的灵活性来构建应用程序。开发人员应使用哪种架构样式取决于应用程序的需求,但是无服务器应用程序具有更高的可伸缩性,并且通常更具成本效益。
容器既包含应用程序,又包含应用程序在正常运行时所需的所有元素,包括系统库、系统设置和其他依赖项。就像“只需加水”的薄煎饼混合粉一样,容器只需一件东西即可托管和运行,以发挥其功能。
任何类型的应用程序都可以在容器中运行。无论在何处托管,容器化应用程序都将以相同的方式运行。容器可以轻松地在任何需要的地方移动和部署,就像标准尺寸的物理运输容器一样,无论里面的内容如何,都可以通过各种运输方式(船舶、卡车、火车等)运输到任何地方。
从技术上讲,容器是将机器或服务器划分为独立用户空间环境的一种方式,因此每个环境仅运行一个应用程序,并且不会与机器上任何其他分区的部分进行交互。每个容器都与其他容器共享计算机的内核(内核是操作系统的基础,它与计算机的硬件进行交互),但其运行却像是计算机上唯一的系统。
虚拟机是一种模仿完整计算机系统的软件。它与托管它的机器的其余部分隔离,并且表现得好像它是唯一的操作系统一样,包括拥有自己的内核。虚拟机是在一个服务器上托管多个环境的另一种常见方式,但是虚拟机比容器占用更多的处理能力。
无服务器应用程序分解为不同功能,并由第三方供应商托管,后者仅根据每个功能运行的时间向应用程序开发人员收费。有关无服务器计算的更多信息,请参见什么是无服务器计算?
“无服务器”计算实际上是在服务器上运行,但是无服务器供应商可以根据应用程序的需要来配置服务器空间。而不会为给定的功能或应用程序分配特定的机器。另一方面,每个容器一次只能停驻在一台机器上,并使用该机器的操作系统,但是如果需要,它们可以轻松地移动到另一台机器上。
在基于容器的体系结构中,部署的容器数量由开发人员预先确定。相比之下,在无服务器架构中,后端会内嵌自动的扩展来满足需求。
如果继续套用运输集装箱这一比喻的话,运输公司可以尝试预测某种产品的需求增加,然后将更多的集装箱运送到目的地以满足该需求,但是如果仍不能满足要求,它就无法瞬间提供更多的集装箱来满足超出预期的需求。
而无服务器架构则恰好可以做到这一点。在计算能力方面,无服务器计算就像现代家庭中的供水:通过打开水龙头,消费者可以随时获取和使用所需的水量,而他们只为所用的水量付费。这比尝试买水桶或运输容器更具可扩展性。
容器会保持一直运转,因此即使没有人使用该应用程序,云提供商也会继续对服务器空间收费。
而无服务器体系结构不会有任何持续性的费用,因为除非调用应用程序代码,否则它不会运行。相反,开发人员仅按其应用程序实际的使用向服务器容量付费。
容器托管在云中,但是云提供商不会对其保持更新或维护。开发人员必须管理和更新他们部署的每个容器。
从开发人员的角度来看,无服务器架构无需管理后端。供应商负责管理运行代码的服务器以及保持其软件更新。
容器与无服务器功能相比,初始设置所需的时间更长,因为必须配置系统设置和库等等。配置完成后,容器仅需几秒钟即可部署。但是,由于无服务器功能比容器微服务小,并且不与系统依赖项捆绑在一起,因此部署它们仅需要几毫秒。代码上传后,无服务器应用程序可以立即启用。
测试无服务器的Web应用程序较为困难,因为后端环境很难在本地环境中复制。相反,无论部署在何处,容器都可以同样运作,这使得在部署到生产环境之前测试基于容器的应用程序会相对简单。
对于支持无服务器架构的 Cloudflare Workers,我们创建了一个虚拟测试环境以帮助改善开发过程。
两者都以云为基础,并且都大大减少了基础设施开销–无服务器计算比容器更重要。在两种体系结构中,应用程序都被分解并作为较小的组件进行部署。在基于容器的体系结构中,每个容器将运行一个微服务。
微服务是应用程序的一部分。每个微服务执行一项服务,多个集成的微服务组合在一起组成应用程序。尽管这个名称似乎暗示着微服务很小,但事实并不必一定如此。
将应用程序构建成微服务集合的优点之一是开发人员可以一次更新一个微服务,而不必在需要进行更改时更新整个应用程序。与无服务器架构中一样,将应用程序构建为功能集合可提供相同的好处,但层次更细。
选择无服务器架构的开发人员将能够快速发布和迭代新的应用程序,而不必担心应用程序是否能够扩展。另外,如果应用程序没有收获持续的流量或使用率,则无服务器计算将比容器更具成本效益,因为不需要持续运行代码。
容器则让开发人员可以更好地控制应用程序运行的环境(尽管这也带来了更多的维护)以及所使用的语言和库。因此,容器对于将旧版应用程序迁移到云端非常有用,因为这样可以更紧密地复制应用程序的原始运行环境。
最后,采用将一些无服务器功能和一些部署在容器中的功能相混合的的体系结构也具有可能性。例如,如果某个应用程序功能所需的内存比无服务器供应商分配的内存更多,或者某个功能太大,或者某个功能(而非其他功能)需要长时间运行,那么混合体系结构可使开发人员获得无服务器所带来的优势,并同时利用容器来获取无服务器无法支持的功能。
Cloudflare 使开发人员能够通过 Cloudflare Workers 来构建高性能的无服务器应用程序。