在尽可能短的时间内、以尽可能少的开销完成尽可能多的工作是现代化开发的基本特征。 最终的目标要实现易于部署、维护和调试。不仅如此,这一切也必须能够运行在云端之上。 针对这些高要求,无服务器应用程序和容器都给出了相应的解决方案。这是两种看上去类似的方案,它们都是为了替代那些需要组织付出更多努力的虚拟机而设计出来的。 然而在这两者之中,容器作为一种更强大的解决方案,包含了运行应用程序所需的一切,通常作为一组微服务来使用。 而无服务器应用程序则是不太复杂的解决方案,专注于依赖于供应商 API 提供的服务的应用程序代码。 我们将会在本篇文章中探讨如何在二者之间做出选择,但是您需要了解的是这两种技术的选择并没有严格的正确或错误之分,只有根据组织的需求做出最有利的选择才是最好的选项。
延伸阅读,了解 Akamai cloud-computing
什么是无服务器?
无服务器应用程序托管在供应商系统上,通过函数提供的功能来响应事件。对于应用了无服务器的组织,开发人员能够专注于代码和应用程序,而无需在服务器或硬件上耗费更多的精力。后端服务和库等基础设施通常由供应商提供。 因此,开发人员只需查看应用程序代码,而无需关心其依赖项。
无服务器应用程序能够提供自动扩展、配置、内置服务集成、自动配置和高可用性等功能。开发人员无需为此付出任何额外努力。由于托管方式的原因,无服务器应用程序可以为组织节省大量依赖成本。
无服务器应用程序可以提供传统桌面支持、后端服务和无服务器 Web 应用程序。与微服务相比,无服务器应用程序代表运行应用程序的方法,而微服务代表设计应用程序的方法。 此外,与微服务不同,无服务器应用程序不会连续运行,它需要一个事件的触发才能开始执行,并且各个函数只执行一项任务。一个微服务可以长期持续运行,并且可以支持多个任务或功能。与微服务相比,使用无服务器应用程序的优点是无服务器应用程序等待事件、运行,然后停止。 因此,在应用程序预计会频繁出现使用高峰的情况下,运行无服务器应用程序的成本比微服务更低。
无服务器可以用于哪些场景?
无服务器应用程序非常适合移动和 Web 应用程序初创公司,因为它们的启动成本较低并且能够处理轻量级应用程序。 它们经常用于以下用例:
- 流量况不可预测的情况
- 物联网 (IoT) 应用
- 任何发生持续且重大变化的应用程序
- 可以将任务分解为单个功能,然后将这些功能组合在一起以创建打包业务能力 (PBC) 的应用程序
考虑无服务器应用程序流程
与大多数应用程序开发一样,构建无服务器应用程序需要遵循一个流程。最终的软件是否代表后端服务、前端服务或两者都并不重要。此流程本质上不同于使用整体应用程序、微服务、打包业务功能 (PBC)、容器应用程序或任何其他软件开发模式。 这一想法是将软件需求分解成更小的部分,直到可以非常简单地描述特定的部分。方法如下:
- 定义执行特定任务的各个服务。
- 定义单个功能(执行一项且仅一项任务的元素)来组成服务。
- 定义触发函数的事件,请记住无服务器应用程序的工作原理是函数启动、执行任务,然后停止。
- 创建描述每个功能的配置文件。
- 创建一个配置提供程序文件,描述该函数如何与支持无服务器应用程序的框架交互。
- 创建一个服务配置,描述提供程序文件、函数文件以及构成服务的任何插件。
什么是容器?
容器与无服务器应用程序存在着区别,因为容器拥有运行应用程序所需的一切,例如库、系统设置和其他依赖项。无服务器应用程序上的这些附加内容意味着开发人员需要关注应用程序代码及其相关的所有内容。因此,开发人员面临的工作量会更大。然而,与无服务器应用程序相比,容器也具有一些明显的优势,其中之一是消除供应商的锁定。例如,Docker 容器应用程序可以在任何支持 Docker 的系统上运行。就像用于运输的集装箱一样,集装箱应用程序也是标准化的。 它们可以移动到任何系统上的任何地方,而无需考虑底层硬件或操作系统细节。
与虚拟机不同,容器只专注于一个应用程序,虚拟机模仿整个计算机、操作系统等。 容器更简单并且资源消耗更少。如果应用程序的复杂程度相同,则可以在物理硬件上运行比虚拟机更多的容器。另一方面,虚拟机可以运行多个应用程序。容器和虚拟机之间的主要区别在于容器在物理机上共享单个内核(操作系统)。 同时,每个虚拟机都有自己的内核。 因此,在物理设备上运行的所有容器应用程序都必须与同一个内核兼容。 使用虚拟机提供了使用最适合相关应用程序的特定内核的机会。
容器可以用于哪些场景?
容器通常用于以下目的:
- 部署API 端点
- 部署重复性工作和任务
- 为持续集成和持续部署(CI/CD)提供开发运营支持
- 托管后台处理应用程序
- 处理事件驱动的处理
- 运行微服务
- 将大型遗留应用程序移至云端
考虑容器应用程序流程
与无服务器应用程序一样,有一个通用流程用于创建各种容器应用程序。 一般来说,这个过程遵循以下步骤:
- 据需要将现有的单体应用程序分解为微服务。
- 基于现有镜像模板创建新的容器镜像。
- 使用主机命令将代码、资源和其他应用程序文件添加到映像中。
- 使用主机命令配置镜像的启动命令。
- 从容器内部构建并运行映像(而不是像平常一样在外部)。
- 使用主机服务器的实例服务部署映像。
无服务器和容器有何相似之处?
无服务器应用程序和容器采用类似的策略,将解决方案分解为更小、更易于管理的部分。 他们也有相同的目标,即降低成本、开发时间和维护时间,同时创建更灵活的环境。
无服务器和容器之间的主要差异有哪些?
除了前面已经提到的差异之外,还可以通过特定方式对它们进行比较。最值得注意的是,这两种技术在使用物理机、扩展、保持低成本和管理部署细节方面存在差异。
物理机
无服务器应用程序能够驻留在多台物理机上,而容器应用程序始终仅驻留在一台物理机上。可以在多台机器上运行的能力为无服务器应用程序提供了资源可用性优势,因此无需开发人员付出大量额外工作。但是,负载均衡等技术可用于在多个物理系统上的容器应用程序的多个实例之间分配负载。最终结果看似相同,但容器应用程序需要更多的配置和实现。
可扩展性
无服务器应用程序在可扩展性方面具有优势,因为它们具备自动扩展能力。托管供应商根据需要提供尽可能少或尽可能多的计算能力来处理给定时间的特定负载。使用容器应用程序时,开发人员需要分配足够的容器来处理预期的负载。 如果负载超出预期,应用程序就会开始运行缓慢,从而对客户产生负面影响。
当负载低于预期时,组织就会在未使用的资源上浪费金钱。完全有可能找到在虚拟机级别自动扩展的云提供商。虽然这可以在一定程度上帮助减轻容器的缺点,但这可由开发人员配置,但不能由他们管理。
成本
无服务器应用程序仅在需要时运行,这意味着直接查看时它们的运行成本低于容器。 然而,当考虑应用程序延迟的成本时,就会出现问题。由于容器始终处于运行状态,因此它可以立即响应任何请求。如果需要从缓存外部加载无服务器应用程序,则在任务完成之前需要考虑额外的时间。时间就是金钱。 因此,即使对于请求一致的负载,容器应用程序实际上也可能成本更低,因为它们响应速度更快。
部署时间
部署应用程序的时间不断缩短。 过去使用物理系统需要几个月的时间,使用虚拟机需要几分钟的时间,而现在使用容器只需几秒钟,使用无服务器应用程序只需几毫秒。无服务器应用程序开发人员通常具有部署时间优势,因为无需配置底层系统依赖项,并且无服务器应用程序较小。
维护
无服务器应用程序比容器需要更少的直接维护,因为托管服务可以满足所有维护需求。 在理想情况下,这意味着无服务器应用程序开发人员在时间上具有显着优势,因为容器开发人员必须解决低级维护问题。 然而,Serverless应用场景也会遇到问题。 例如,有兴趣保持所有内容最新的供应商推送的意外或不需要的更新。 由于容器开发人员可以直接控制底层细节,因此可以在对容器应用程序最有利的时间进行维护。 从长远来看,这可能会节省时间。
测试
使用无服务器应用程序时,由于它特殊的运行方式,应用程序测试具有挑战性。事件触发该函数,该函数执行任务并立即关闭。开发人员经常被迫使用应用程序日志来定位问题的根源。对于容器应用程序,无论其在何处运行,都会以相同的方式持续运行。 在这种情况下,开发人员通常会在调试过程中使用标准化工具。 许多 IDE(例如 IntelliJ IDEA)都被设置为调试容器应用程序。
开发者应该基于哪些因素来选择使用哪一种方案?
无服务器应用程序在处理突然激增的负载时可以缩短部署时间、减少维护要求并降低成本。 对于那些需要管理较小、不太复杂的应用程序而无需特殊底层支持需求的初创公司来说,它们是最佳选择。
容器应用程序可以降低一致负载的成本,并提高应用程序配置的灵活性。 当需要将遗留应用程序从本地服务器迁移到云时,容器应用就成为最佳的选择。
结论
无论是无服务器应用程序还是容器都有各自的优点和缺点。有时,最好的选择不是做出选择,而是使用适合特定需求的技术。解决方案的一部分可以采用无服务器应用程序运行,其他部分可以采用容器方式运行。当0然,这种组合选项也会存在缺点。其中最重要的是必须为单个解决方案管理两种不同的技术。这会增加复杂性并可能降低可靠性和安全性。
这篇文章的内容感觉还行吧?有没有想要立即在 Linode 平台上亲自尝试一下?别忘了,现在注册可以免费获得价值 100 美元的使用额度,快点自己动手体验本文介绍的功能和服务吧↓↓↓
欢迎关注Akamai ,第一时间了解高可用的MySQL/MariaDB参考架构,以及丰富的应用程序示例。