Cloud Programming Simplified: A Berkeley View on Serverless Computing

云计算编程的简化:伯克利对无服务器计算的观点

Abstract

无服务器云计算几乎处理了所有的系统管理操作,使程序员更容易使用云计算。它提供了一个接口,大大简化了云计算编程,并代表了从汇编语言到高级编程语言的过渡,是一种与汇编语言到高级编程语言并行的演进。本文介绍了云计算的快速发展史,包括2009年伯克利云计算论文的预测,解释了无服务器计算的动机,描述了无服务器计算的应用,扩展了当前无服务器的极限,然后列举了无服务器计算的障碍和研究机会,以充分发挥其潜力。正如2009年的论文指出了云计算面临的挑战,并预言这些挑战将得到解决,云计算的使用将加速,我们预测这些问题是可以解决的,无服务器计算将在未来的云计算中占据主导地位。

1 Introduction to Serverless Computing

无服务器计算简介

2009年,为了帮助解释围绕云计算的兴奋点,“伯克利对云计算的看法”[2]确定了六个潜在的优势。

  1. 按需提供无限计算资源的出现。
  2. 省去了云用户的前期承诺。
  3. 能够根据需要短期支付计算资源的使用费用。
  4. 规模经济,由于有很多非常大的数据中心,大大降低了成本。
  5. 通过资源虚拟化简化操作,提高利用率。
  6. 通过复用不同组织的工作负载,提高硬件利用率。

过去十年,这些优势基本实现,但云用户仍然承受着来自复杂操作和的负担,许多工作负载仍然不能从高效的多路复用中获益。这些不足主要对应于未能实现最后两个潜在优势。云计算减轻了用户对物理基础设施的管理,但却让他们不得不管理大量的虚拟资源。多路复用对于批处理风格的工作负载(如MapReduce或高性能计算)效果很好,可以充分利用他们分配的实例。对于有状态的服务,例如将数据库管理系统等企业软件移植到云端时,多路复用就不太行得通了。

2009年,云计算中的虚拟化有两种相互竞争的方法。
亚马逊EC2是其中一种。一个EC2实例看起来很像物理硬件,用户可以控制几乎整个软件栈,从内核向上.……另一方面是针对特定应用领域的平台,如Google App Engine…强制执行无状态计算层和有状态存储层之间干净分离的应用结构。App Engine令人印象深刻的自动扩展和高可用性机制…依赖于这些约束。

市场最终接受了亚马逊的云计算低级虚拟机方式,于是谷歌、微软和其他云公司也提供了类似的接口。我们认为,低级虚拟机成功的主要原因是,在云计算的早期,用户希望在云端重新创建与本地计算机上相同的计算环境,以简化将工作负载移植到云端的过程[3-6]。这种实际的需求,足够明智,优先考虑为云计算编写新的程序,尤其是在不清楚云计算的将会怎样成功的情况下。

这种选择的缺点是,开发人员必须自己管理虚拟机,基本上要么成为系统管理员,要么与他们一起建立环境。表1列出了在云中运行环境必须管理的问题。长长的低级虚拟机管理责任清单激发了拥有更简单应用的客户要求为新应用提供更简单的云计算路径。例如,假设应用程序想要将图片从手机应用程序发送到云端,云端应该创建缩略图,然后将它们放在网络上。完成这些任务的代码可能是几十行JavaScript,与建立具有适当环境的服务器以运行代码所需的费用相比,这将是一个微不足道的开发量。

Cloud Programming Simplified: A Berkeley View on Serverless Computing
认识到这些需求后,亚马逊在2015年推出了一个新的选择,称为AWS Lambda服务。Lambda提供了云函数(cloud functions),并引起了人们对无服务器计算的广泛关注。虽然无服务器计算可以说是一个矛盾的说法,你仍然在使用服务器进行计算,但这个名字保留下来,大概是因为它表明云用户只需编写代码,并将所有的服务器配置和管理任务留给云提供商。虽然云函数以FaaS(Function as a Service,功能即服务)的形式打包,代表了无服务器计算的核心,但云平台也提供专门的无服务器框架,以BaaS(Backend as a Service,后端即服务)的形式满足特定的应用需求[7]。简单来说,无服务器计算=FaaS+BaaS。在我们的定义中,一个服务要被认为是无服务器的,它必须自动扩展,不需要显式配置,并根据使用情况来计费。在本文接下来的内容中,我们将重点讨论云函数的出现、发展和未来。云函数是当今无服务器计算中的通用元素,它引领着云计算的简化和通用编程模型的发展方向。

接下来,我们将介绍和定义无服务器计算。就像最初的Berkeley View关于云计算的论文一样,我们随后列出了无服务器计算要实现其承诺所需要解决的挑战和研究机会。虽然我们不确定哪些解决方案会胜出,但我们相信所有的问题最终都会得到解决,从而使无服务器计算成为云计算的代言人。

2 Emergence of Serverless Computing

无服务器计算的出现

在任何一个无服务器平台中,用户只需用高级语言编写一个云函数,选择应该触发该函数运行的事件–比如将图像加载到云存储中,或者将图像缩略图添加到数据库表中,然后让无服务器系统处理其他一切:实例选择、扩展、部署、容错、监控、日志、安全补丁等。表2总结了无服务器方式和传统方式的区别,我们在本文中称其为服务器式云计算。请注意,这两种方法代表了基于功能/以服务器为中心的计算平台的两个极端,Kubernetes等容器化编排框架代表了中间态。
Cloud Programming Simplified: A Berkeley View on Serverless Computing
图1说明了无服务器如何通过使云资源更容易使用来简化应用开发。在云计算背景下,有服务器计算就像用低级汇编语言编程,而无服务器计算则像用Python等高级语言编程。汇编语言程序员计算一个简单的表达式,如c = a + b,必须选择一个或多个寄存器使用,将值加载到这些寄存器中,执行运算,然后存储结果。这反映了无服务器云编程的几个步骤,即首先提供资源或确定可用资源,然后用必要的代码和数据加载这些资源,执行计算,返回或存储结果,最终管理资源释放。无服务器计算的目的和机会是给云程序员带来类似于向高级编程语言过渡的好处[7]。高级编程环境的其他特征在无服务器计算中也有天然的相似之处。自动内存管理使程序员从管理内存资源中解脱出来,而无服务器计算则使程序员从管理服务器资源中解脱出来。

准确地说,无服务器计算和有服务器计算之间有三个关键的区别:

  1. 计算和存储的解耦。存储和计算是分开扩展的,并分别供应和定价。一般情况下,存储是由独立的云服务提供的。计算是无状态的。
  2. 执行代码时不管理资源分配。用户无需请求资源,只需提供一段代码,云就会自动提供资源来执行该代码。
  3. 按使用资源的比例付费,而不是按分配的资源付费。计费方式是由多个与执行相关的维度确定,如执行时间,而不是通过一个基础云平台的维度,如分配的虚拟机的大小和数量。

利用这些区别,我们接下来解释serverless与过去和现在类似产品的区别。
Cloud Programming Simplified: A Berkeley View on Serverless Computing

2.1 Contextualizing Serverless Computing

无服务器计算的背景

需要哪些技术突破才能使无服务器计算成为可能?有些人认为,无服务器计算仅仅是对之前产品的重新包装,也许是对平台即服务(PaaS)云产品的适度概括,如Heroku[8]、Firebase[9]或Parse[10]。其他人可能会指出,上世纪90年代流行的共享web托管环境提供了无服务器计算所能提供的大部分功能。例如,它们具有无状态编程模型,允许高级别的多租户、对可变需求的弹性响应,以及标准化的函数调用API、公共网关接口(CGI)[11],它甚至允许直接部署用Perl或PHP等高级语言编写的源代码。谷歌最初的应用程序引擎也允许开发者部署代码,而将大部分操作留给云提供商。我们相信无服务器计算代表了对PaaS和其他以前的模型的重大创新。

今天的具有云功能的无服务器计算在几个基本方面不同于它的前辈:更好的自动伸缩、强大的隔离、平台灵活性和服务生态系统支持。在这些因素中,AWS Lambda提供的自动缩放标志着与以前的显著不同。它以比服务器自动缩放技术更高的保真度跟踪负载,在需要时快速响应扩展,在没有需求时一直扩展到零资源和零成本。它以一种更细粒度的方式进行收费,当其他自动计费服务按小时收费时,每次提供100毫秒的最低计费增量。它对客户实际执行代码的时间收费,而不是对执行程序所保留的资源收费。这种区别确保了云提供商在自动缩放上有了“外壳”,从而提供了激励机制来确保有效的资源分配。

无服务器计算依靠强大的性能和安全隔离使多租户硬件共享成为可能。类似于VM的隔离是云功能的多租户硬件共享的当前标准[12],但是因为VM的提供可能需要很多秒,所以没有服务器的计算提供者使用复杂的技术来加速功能执行环境的创建。AWS Lambda中用的一种方式是,维护一个在被分配给用户时需要的VM实例“暖池”,以及一个以前用于运行函数并为将来调用维护的“活动池”[13]。 实现高利用率所必需的资源生命周期管理和多租户bin打包是实现无服务器计算的关键技术。 我们注意到,最近有几个建议旨在通过利用容器、unikernel、库操作系统或语言vm来减少提供多租户隔离的开销。 例如,谷歌已经宣布 gVisor[14]已经采用App Engine、云功能、和云机器学习引擎,亚马逊发布了 Firecracker vm [15]、AWS Lambda、AWS Fargate 和 CloudFlare Workers 无服务器平台提供了JavaScript云方法的多用户隔离,使用web浏览器沙盒技术[16]。

其他一些区别也帮助了无服务器计算取得了成功。通过允许用户携带自己的库,无服务器计算可以支持比PaaS服务更广泛的应用程序,后者与特定用例紧密相连。Serverless计算在现代数据中心运行和运行在更大的规模比旧的共享主机托管环境。

如第1节所述,云函数(即FaaS)推广了无服务器范式。然而,值得承认的是,他们的成功部分归功于自公共云诞生以来就存在的BaaS服务,比如AWS S3。在我们看来,这些服务是特定于领域的、高度优化的无服务器计算实现。云函数以更一般的形式表示无服务器计算。通过比较几种服务的编程接口和成本模型,我们在表3中对这个视图进行了总结。

在讨论无服务器计算时,一个常见的问题是它如何与Kubernetes[17]相关,后者是一种用于部署微服务的“容器编排”技术。与无服务器计算不同,Kubernetes是一种简化服务器计算管理的技术。经过多年在谷歌内部的使用[18],它得到了迅速的采用。Kubernetes可以提供短期的计算环境,如无服务器的计算,并且在硬件资源、执行时间和网络通信方面的限制要少得多。它还可以在公共云上完全部署最初为内部使用而开发的软件,只需稍加修改。另一方面,无服务器计算引入了范式转换,允许将操作责任完全转移给提供者,并使细粒度的多租户多路复用成为可能。托管的Kubernetes产品,如谷歌Kubernetes引擎(GKE)和AWS弹性Kubernetes服务(EKS),在这个连续体中提供了一个中间位置:它们减轻了Kubernetes的操作管理,同时为开发人员提供了配置任意容器的灵活性。托管的Kubernetes服务和无服务器计算之间的一个关键区别是计费模型。前者按预留资源收费,后者按功能执行时间收费。
Cloud Programming Simplified: A Berkeley View on Serverless Computing

Kubernetes也是混合应用程序的完美匹配,其中一部分在本地硬件上运行,一部分在云上运行。我们认为,这种混合应用程序在向云的过渡中是有意义的。然而,从长远来看,我们相信云规模的经济效应、更快的网络带宽、不断增加的云服务以及通过无服务器计算简化的云管理将会降低这种混合应用的重要性。

边缘计算是后pc时代云计算的合作伙伴,虽然我们在这里关注的是无服务器计算将如何改变数据中心内的编程,但Edge也有有趣的潜在影响。一些内容分发网络(CDN)运营商提供了在靠近用户的设施[19,20]中执行无服务器功能的能力,而AWS IoT Greengrass[21]甚至可以在edge设备中嵌入无服务器执行。

现在我们已经定义了无服务器计算并将其置于上下文中,让我们看看它为什么会吸引云提供商、云用户和研究人员。

2.2 Attractiveness of Serverless Computing

无服务器计算的吸引力

对于云提供商来说,无服务器计算促进了业务增长,因为使云更容易编程有助于吸引新客户,并帮助现有客户更多地使用云产品。例如,最近的调查发现,约24%的无服务器用户是云计算的新用户[22],30%的现有服务器云客户也使用了无服务器计算[23]。此外,运行时间短、内存占用小和无状态特性通过使云提供商更容易找到未使用的资源来运行这些任务,从而改进了统计多路复用。云提供商还可以利用不太流行的计算机(实例类型由云提供商决定),比如对有服务器的云客户吸引力不大的老服务器。这两种福利都增加了现有资源的收入。
Cloud Programming Simplified: A Berkeley View on Serverless Computing
客户可以从提高的编程效率中获益,并且在许多场景中还可以享受成本节约,这是底层服务器利用率更高的结果。即使无服务器计算让客户更高效,Jevons paradox[24]表示,他们将会增加对云的使用,而不是减少,因为更高的效率会增加用户量,从而增加需求。

Serverless还将云部署级别从x86机器(99%的云计算机使用x86指令集)提高到高级编程语言(9),这使得架构创新成为可能。如果ARM或RISC-V提供了比x86更好的性价比,那么无服务器计算使得改变指令集更加容易。云提供商甚至可以研究面向语言的优化和特定领域的架构,这些架构专门用于加速用Python[25]这样的语言编写的程序(见第4节)。

云用户喜欢无服务器计算,因为初学者可以在不了解云基础设施的情况下部署功能,而且专家可以节省开发时间并专注于他们的应用程序特有的问题。Serverless用户可以省钱,因为只有当事件发生时函数才执行,细粒度的价格计算(通常是100毫秒)意味着他们只支付他们使用和储备。表4显示了当今无服务器计算最流行的用法。

研究人员被无服务器计算吸引,特别是云函数,因为它是一个新的通用计算抽象,有望成为云计算的未来,而且有很多机会提高当前的性能并克服当前的限制。

3 Limitations of Today’s Serverless Computing Platforms

当今无服务器计算平台的局限性
Cloud Programming Simplified: A Berkeley View on Serverless Computing

3.1 Inadequate storage for fine-grained operations

细粒度作业的储存不足

3.2 Lack of fine-grained coordination

缺乏精细化协调
Cloud Programming Simplified: A Berkeley View on Serverless Computing

3.3 Poor performance for standard communication patterns

标准通信模式性能差

Cloud Programming Simplified: A Berkeley View on Serverless Computing

3.4 Predictable Performance

可预测的性能

4 What Serverless Computing Should Become

无服务器计算应该发展成什么

既然我们已经解释了今天的无服务器计算及其局限性,让我们展望未来,了解如何将其优点应用到更多的应用程序中。研究人员已经开始解决上面提出的问题,并探索如何改进无服务器平台及其上运行的工作负载的性能[48,49]。我们伯克利的同事和我们中的一些人所做的额外工作强调以数据为中心,分布式系统,机器学习,编程模型的挑战和机会,为无服务器计算[50]。我们从广义的角度来看待如何增加应用程序和硬件的类型,这些应用程序和硬件可以很好地与无服务器计算一起工作,我们在5个领域确定了研究的挑战:抽象、系统、网络、安全和体系结构。

4.1 Abstraction challenges

抽象的挑战

4.2 System challenges

系统挑战

4.3 Networking challenges

网络挑战

4.4 Security challenges

安全挑战

4.5 Computer architecture challenges

计算机架构的挑战

5 Fallacies and Pitfalls

错误和陷阱

6 Summary and Predictions

总结和预测

通过提供一种简化的编程环境,无服务器计算使得云的使用更加容易,从而吸引更多能够并且愿意使用它的人。无服务器计算包括FaaS和BaaS产品,标志着云编程的一个重要成熟。它不再需要手工资源管理和优化,今天的serverful计算强加于应用程序开发人员,一个成熟的类似于从汇编语言到高级语言超过四十年前。

我们预测无服务器的使用将会激增。我们还预计,随着时间的推移,混合的本地云应用程序将会减少,尽管由于监管约束和数据治理规则,一些部署可能会持续存在。

7 Acknowledgements

References

上一篇:Programming Concepts: Concurrency


下一篇:The c Programming Language 全部习题解答(更新中)