无服务器计算为寻求减轻基础设施负担的开发人员提供了一个很好的机会。通过抽象除代码块之外的一切,无服务器模型使开发人员能够更快地迭代和部署新代码,并使预算较少的小团队能够做只有大公司才能做的事情。或者,正如Cloudability创始人兼首席执行官Mat Ellis在最近一期CloudCast中所说,“无服务器试图将开发者的影响力产业化”。
当然,在后台,服务器依然存在,一直嗡嗡作响。但是无服务器架构是无状态的。他们通过执行一些逻辑(一个函数)和调用其他服务来完成他们的工作。如果您是一名开发人员,主要使用服务通过api构建应用程序,或者需要响应事件,那么无服务器架构可能是完成工作最简单、最快和风险最小的方法。
在本文中,我们将分解无服务器架构的真正含义,提供主要公共云选项的详细比较,并介绍可口可乐正在实施的一个真实的无服务器项目。
《品牌邮报》由HPE赞助。
管理多云复杂性的三种方法。
人工智能、编译和自动化的新时代帮助企业管理日益增加的信息技术复杂性。
无服务器是一种云计算服务模式,它与IaaS、PaaS、SaaS、BaaS和CaaS一样,依赖于对可配置网络、存储和计算资源的动态共享池的无处不在、方便和按需的访问。然而,无服务器以不同的方式使用这些资源。目前,无服务器计算还没有一致的定义,但已经有关于这个概念的说法。在没有服务器的情况下,一个功能就是一个部署单元。程序员看不到任何机器、虚拟机或容器。
云中无服务器可用的主要服务包括AWS Lambda、Azure功能和Google Cloud功能。在云计算中,“FaaS”(功能即服务)可能是一个更好的术语。当我们说“功能”时,我们实际上是指功能。这是AWS Lambda的一个例子。用Node.js写:
就这样。上传一个函数,并将其连接到请求或事件。当您的无服务器宿主提供程序(在这种情况下是AWS)检测到请求(例如,REST调用)或事件发生时(例如,文件被添加到S3桶),通过调用您的函数传入的参数和您返回的参数将传递结果。当然,在实践中更为复杂。例如,您可以添加安全限制,但这是其本质。
您的函数可以用提供商支持的任何语言编写。您所需要做的就是将传入的请求或事件映射到函数调用。每个提供商都有自己支持的语言、约定、流程、成本、功能和限制(见下表)。但这就是无服务器宣言的意思,也就是“使用你自己的代码”。
您的函数可以任意复杂,它可以通过API调用包含的库或外部服务。为了实现可伸缩性,没有服务器的功能必须只使用可伸缩的服务。
根据提供程序的不同,代码可以直接在在线编辑器中编写,也可以作为代码文件上传。zip或。jar文件或容器。这也是无服务器的一个缺点,因为在整个发布周期中上传和管理代码的工具仍然不是很好,尽管许多框架正在填补这个空白。
当然,代码不能任意复杂。根据供应商的不同,会有一些限制。每个主机都有一个最大代码上传大小(例如,AWS Lambda为50MB)。每个主机都有一个最大的函数执行时间(AWS Lambda是1到300秒)。每个功能的可用内存和CPU容量也是有限的。想要更多内存、更好的CPU还是更长的执行时间?你花了更多的钱。计费是提供商之间的另一个区别,我们将在下面看到。
当然,幕后也有服务器,但作为开发人员,你不需要去想它们。你只需要知道你的功能。您不再需要处理容量规划、部署、扩展、安装、修补等。这通常被认为是一个错误,但实际上是一个不同的错误。仍然需要组织、开发、构建、测试、版本控制、发布、记录和监控代码。
因为您看到的都是函数,所以您的提供者负责激活您的函数以响应任何请求或事件。当请求出现并且函数的空闲实例不可用时,必须将代码分配给服务器并启动。作为开发者,你什么都不做。这取决于您的提供商,以确保有足够的容量来处理负载。当然,在冷启动场景中,延迟问题是无服务器的缺点之一。
在无服务器的情况下,您需要支付消费,并且仅在服务运行时。你永远不会为闲置的计算时间买单。影响是巨大的。你不用花一分钱就能建造一个完整的基础设施。运营、开发和扩展成本都降低了。
将此与PaaS/IaaS进行比较,在PaaS/IaaS中,您需要为容量付费。PaaS提供商将为您管理服务器,但是您的应用程序有一些长时间运行的进程,即使它们是空闲的,您也必须为它们付费。容量可以通过构建一个对负载敏感的自动扩展系统来管理,但是您总是需要为一些多余的容量付费。
因为你看到的是一个函数,没有地方存储状态。当一个函数被执行时,它的计算资源可以被垃圾收集和重用。状态必须存储在另一个服务中,如数据库或缓存。
为了控制收费成本,提供商为一个功能设置最大执行时间。目前AWS Lambda和Azure功能只需要5分钟。执法限制也有不利的一面。例如,如果我想升级数据库,我应该怎么做?还是你的函数多次调用其他服务来返回结果?还是你的函数有很多输入要处理?在某些情况下,这些操作可能需要5分钟以上。
除非您的函数很简单,否则您需要将其编码为由调用的无状态、幂等、事件驱动的服务。
间将数据保存在持久存储中的状态机驱动。这可能会变得很复杂。通常的云计算方法仍然有效。例如,将输入划分为多个批,并将它们放在工作队列中。为了在这方面提供帮助,AWS创建了一个名为Step Functions的新服务,它实现了一个状态机,并允许函数无限期地持续下去。实际上,AWS Lambda应该更好,而不是要求使用完全不同且昂贵的服务。
尽管serverless将服务接口缩小到单个功能(有时称为nanoservice),但复杂性始终是守恒的。对于PaaS,计算的原子单位是应用程序。这有好处也有坏处。由于应用程序很大,启动和停止可能很慢;它很难根据需求扩大规模;它可能很难在一个颗粒级账单。但是PaaS也易于管理、监视和调试。
通过将代码分散到可能大量的函数中,serverless确实很难调试。逻辑流的跟踪分布在许多不同的日志文件中,调用之间没有连接。需要日志和度量,但这还不够。这个领域的工具需要改进。
如何开始?有许多选项可以使用serverless开始滚动。两个主要方面:使用公共云和使用本地解决方案。
无服务器已经成为任何公共云的表赌注,所以所有的主要供应商都在开发自己的产品。亚马逊有AWS Lambda,自2015年4月以来一直是GA。微软拥有Azure功能,该功能自2016年11月以来一直在使用。谷歌具有谷歌云功能,处于封闭的alpha状态。
在这三种选择中,如果您已经使用了公共云,那么最好使用当前提供商的产品。使用serverless的一大好处是可以使用丰富的可用服务和事件。这些选择在你的云里是最好的。但如果你刚开始接触云计算,而且稳定性很重要,那么AWS Lambda是迄今为止出现时间最长、最安全的选择。
对于AWS Lambda,函数是独立的,尽管在实践中,它们常常使用类似于Serverless的框架在组中进行管理。根据函数请求的数量和代码执行的时间来收费。如果你想要更多的CPU,你必须分配更多的内存。
通过Azure功能,一个功能应用由一个或多个单独的功能组成,这些功能由Azure应用服务一起管理。功能应用可以使用消费托管计划,也可以使用应用服务托管计划。有了消费计划,功能应用程序可以自动伸缩,你可以根据内存大小和所有功能的总执行时间(以gb秒为单位)付费。使用应用服务托管计划更像是EC2。
由于谷歌云功能仍然处于封闭的alpha测试阶段,关于功能如何操作和计费的很多信息仍然未知。我们知道有两种类型的函数:HTTP函数和后台函数。HTTP函数是通过HTTP直接调用的。后台函数是通过谷歌云发布/订阅主题上的消息或谷歌云存储桶中的更改来间接调用的。