企业开发人员通常花费大量时间编写代码解决业务问题。然后运营团队又花费大量时间进行研究,首先要弄清楚如何获得开发人员编写的代码,并在可用的计算机上运行,然后确保这些计算机运行平稳。而这似乎是一个永无止境的任务。为什么不把那部分让别人去做?
在过去的二十年中,IT领域的许多创新(例如,虚拟机、云计算、容器)一直致力于确保企业不必过多地考虑运行代码的底层物理机器。无服务器计算是一种越来越流行的模式,它将这种愿望用于其逻辑结论:使用无服务器计算,企业无需了解代码运行的硬件或操作系统,因为服务提供商都会为企业提供服务。
什么是无服务器计算?
无服务器计算是云计算的一种执行模型,云计算提供商在其中动态分配,然后仅为执行特定代码片段所需的计算资源和存储向用户收费。当然,仍然涉及服务器,但它们的供应和维护完全由提供商负责。亚马逊的无服务器倡导者Chris Munns在2017年的一次会议上表示,“从团队编写和部署代码的角度来看,根本没有服务器可以管理或配置。这包括任何可能是裸机的东西,任何虚拟的东西,任何容器,任何涉及到管理主机、修补主机或在操作系统级别处理任何事情的东西,在无服务器的世界中都不是必须要做的事情。”
正如开发人员Mike Roberts所解释的那样,该术语曾被用于所谓的“后端即服务”场景,其中移动应用程序将连接到完全托管在云中的后端服务器。但是目前,当人们谈论无服务器计算或无服务器架构时,它们意味着是“功能即服务”产品,其中客户编写的代码只解决业务逻辑并将其上传到提供商。该提供程序负责所有硬件配置、虚拟机和容器管理,甚至是多线程等通常内置于应用程序代码中的任务。
无服务器功能是事件驱动的,这意味着只有在请求触发时才会调用代码。提供商仅对该执行所使用的计算时间收费,而不是维护物理服务器或虚拟服务器收取的每月固定费用。这些功能可以连接在一起以创建处理管道,或者它们可以作为更大应用程序的组件,与在容器中或在传统服务器上运行的其他代码交互。
无服务器计算的优点和缺点
从这个描述中,无服务器计算的两个最大好处应该是明确的:开发人员可以关注他们编写的代码的业务目标,而不是基础设施问题;组织只为他们实际使用的计算资源支付非常具体的费用,而不是购买物理硬件或租用大部分闲置的云计算实例。
正如行业专家Bernard Golden指出的那样,这一点对事件驱动的应用程序特别有益。例如,企业可能有一个大部分时间处于空闲状态的应用程序,但在某些条件下必须同时处理许多事件请求。或者,企业可能拥有一个应用程序来处理从有限性或间歇性全球互联网连接的物联网设备发送的数据。在这两种情况下,传统方法都需要配置一个能够处理峰值工作能力的强大服务器,但是大多数时候服务器都未得到充分利用。使用无服务器架构,企业只需为实际使用的服务器资源付费。无服务器计算也适用于特定类型的批处理。无服务器架构用例的规范示例之一是上载和处理一系列单个图像文件,并将它们发送到应用程序的另一部分的服务。
也许无服务器功能最明显的缺点是,它们是短暂的,并不适合长期任务。大多数无服务器提供商不会让企业的代码执行超过几分钟,当企业启动一个功能,它不会保留以前运行的实例中的任何状态数据。一个相关的问题是,无服务器代码可能需要几秒钟才能启动,这对于许多用例而言不是问题,但是如果企业的应用程序需要低延迟,则需要发出警告。
正如Rohit Akiwatkar和Gary Arora所指出的,许多其他缺点都与供应商锁定有关。尽管有可用的开源选项,但无服务器市场由大型商业云计算提供商主导,这将在稍后讨论。这意味着开发人员通常最终会使用其供应商提供的工具,这使得如果他们变得不满意就很难切换。而且,由于很多无服务器计算都是在供应商的基础设施上进行的,因此很难将无服务器代码集成到内部开发和测试管道中。
无服务器供应商:AWS Lambda、Azure Functions和Google Cloud Functions
无服务器计算的现代时代始于2014年,当时推出基于亚马逊云服务的AWS Lambda。微软公司于2016年推出了Azure Functions。自2017年以来一直处于测试阶段的Google Cloud Functions终于达到了生产状态。这三种服务的局限性、优势、支持的语言和做事方式略有不同。Rohit Akiwatkar对这三者之间的区别进行了详细的描述。运行中还有IBM Cloud Functions,它基于开源的Apache OpenWhisk平台。
在所有无服务器计算平台中,AWS Lambda是最突出的,显然已经有更多的时间来发展和成熟。行业媒体报道了过去一年中添加到AWS Lambda的更新和新功能。
无服务器堆栈
与许多软件领域的情况一样,无服务器世界已经看到了软件堆栈的发展,这些软件堆叠了构建无服务器应用程序所需的不同组件。每个堆栈都包含一个企业要编写代码的编程语言,一个为企业代码提供结构的应用程序框架,以及一组平台将理解并用于启动代码执行的触发器。
虽然企业可以混合使用这些类别中的不同特定产品,但根据企业使用的供应商的不同,存在一些限制和重叠。例如,对于语言,企业可以在AWS Lambda上使用Node.js、Java、Go、C#和Python,但只有JavaScript、C#和F#在Azure上工作。在涉及触发器时,AWS Lambda拥有更多的产品,但其中许多都是特定于AWS平台的,如Amazon Simple Email Service和AWS CodeCommit;同时,Google Cloud Functions可以由通用HTTP请求触发。行业专家Paul Jaworski深入研究了三大产品中的每一个产品的堆栈。
无服务器框架
这个方程式的框架部分很好地定义了如何最终构建应用程序。亚马逊有自己的原生产品,即开源的无服务器应用程序模型(SAM),但也有其他产品,其中大多数是跨平台的,也是开源的。其中最流行的是无服务器,并且强调它为每个支持的平台提供相同的体验,即AWS Lambda、Azure Functions、Google Cloud Functions和IBM OpenWhisk。另一个受欢迎的产品是Apex,它可以帮助某些提供商使用某些语言。
无服务器数据库
正如上面提到的,使用无服务器代码的一个奇怪之处是没有持久状态,这意味着局部变量的值不会在实例化中持续存在。企业的代码需要访问的任何持久性数据必须存储在其他位置,并且主要供应商的堆栈中可用的触发器都包含企业的功能可以与之交互的数据库。
其中一些数据库本身称为无服务器。这意味着它们的行为与在本文中讨论的其他无服务器功能非常相似,但显而易见的例外是数据无限期存储。但是,在配置和维护数据库时所涉及的大部分管理开销都被忽略了。正如开发人员Jeremy Daly所说,“企业所需要做的就是配置一个集群,然后所有的维护、修补、备份、复制和扩展都会自动处理。”与功能即服务产品一样,企业只需支付实际使用的计算时间和资源根据需要扩展或缩减以满足需求。
三大无服务器提供商各自提供自己的无服务器数据库:亚马逊拥有Aurora无服务器和DynamoDB,微软拥有Azure Cosmos数据库,谷歌公司拥有Cloud Firestore。但这些并不是唯一可用的数据库。Nemanja Novkovic提供了更多产品信息。
无服务器计算和Kubernetes
容器有助于为无服务器技术提供动力,但管理它们的开销由供应商负责,因此对用户不可见。许多人认为无服务器计算是一种在不必处理其复杂性的情况下获得容器化微服务的许多优点的方法,甚至开始谈论后容器世界。
实际上,容器和无服务器计算几乎肯定会在未来许多年内共存,实际上无服务器功能可以与容器化微服务存在于同一应用程序中。Kubernetes是最受欢迎的容器编排平台,也可以管理无服务器基础设施。实际上,使用Kubernetes,企业可以在单个集群上集成不同类型的服务。
无服务器脱机
企业可能会发现无服务器计算开始的前景有点令人生畏,因为企业似乎需要与供应商签约才能开展,并了解它是如何工作的。但不要担心:有些方法可以在企业自己的本地硬件上脱机运行无服务器代码。例如,AWS SAM提供了一个本地功能,允许企业脱机测试Lambda代码。如果企业正在使用的是无服务器应用程序框架,那么可以离线查看无服务器应用程序框架,该插件允许企业在本地运行代码。