基于无服务器架构的云原生应用软件研究

2022-07-13 00:59张国生
中国电子科学研究院学报 2022年2期
关键词:开发人员实例应用程序

张国生

(云南大学,云南 昆明 650500)

0 引 言

软件开发正在经历根本性的变革,大而全的应用,长时间的构建、测试和发布周期,难以快速迭代用户反馈等严重制约了软件工程的发展。单体应用的程序代码复杂,扩展能力受限,缺乏动态缩放和有效添加新功能的能力,阻碍了技术创新,难于开发、维护、扩展、部署和故障隔离,微服务架构将单体应用拆分成多个独立的微服务,易于开发和扩展,技术栈不受限制,能按需伸缩,但资源利用率低,运行和维护成本高。良好的软件产品建立在快速构建、及时理解用户反馈的基础上,开发人员利用云计算资源、开源软件和第三方服务,整合一流技术,缩短软件产品推向市场的时间。云计算时代出现大量XaaS(X as a Service)形式的概念,从基础设施即服务(Infrastructure as a Service,IaaS)、平台即服务(Platform as a Service,PaaS)、软件即服务(Software as a Service,SaaS)到容器云引领的容器即服务(Container as a Service,CaaS),再到微服务架构,它们都试图将各种软硬件资源抽象为一种服务,提供给开发人员使用,使他们不再关注基础设施、资源调配、中间件等,减轻开发负担的同时更好地聚焦于业务功能和性能。软件开发需要全新的基础设施栈,使开发人员专注于提升业务价值。基础设施抽象、自动伸缩和更好的资源利用使无服务器计算获得成功,无服务器重新定义了软件的开发、部署、运维、管理和商品化。

2019年,无服务器被Gartner称为最有潜力的云计算技术发展方向,并被赋予是必然性的发展趋势。无服务器从底层开始变革计算资源的形态,为软件架构设计、应用服务、软件部署带来了新的设计思路,无服务器架构作为一种新技术迅速涌现。无服务器计算能帮助企业构建轻量级、高度灵活和无状态的应用程序,得到了企业的青睐,许多企业已经将无服务器计算纳入他们的解决方案。

无服务器计算是一种新兴的范式,支持高度可扩展、事件驱动的应用程序,云提供商充当服务器,动态管理计算资源的分配[1]。Google将云函数描述为一种基于事件、轻量、异步的计算解决方案,用于创建更小的单任务函数响应不同的云事件,无服务器零运维,无需管理服务器及其运行时环境[2]。在编写事件驱动的无服务器应用程序时,使用高级语言编写,第三方服务和微服务通过函数调用或直接调用融入事件驱动服务中。用户使用无服务器模型构建应用程序,底层基础设施具有良好弹性,按使用量计费降低了成本,易于使用的接口和配置,使开发人员不用理解基础设施,不再将基础设施作为应用程序设计的一部分。

无服务器计算将应用程序分解为多个独立的无状态细粒度函数[3]。函数仅在响应事件时执行,并且可以独立扩展,函数是无状态的,无服务器计算也被称为函数即服务(Function as a Service,FaaS)[4]。开发人员只需在无服务器平台上编写代码并部署函数,平台负责函数执行、存储、容器、网络通信和容错,根据请求数扩展函数,用户只需为每次函数调用使用的计算资源付费[5]。无服务器计算在网络边缘计算、科学计算和移动计算等方面是很有潜力的方法[6]。无服务器与人工智能结合,可以快速实现人脸识别、车牌识别、人工智能推理等应用。主要的云服务提供商Amazon Web Services(AWS)Lambda、Azure函数、IBM云函数和Google云函数都为无服务器计算提供解决方案。

无服务器计算使开发人员从简单的部署、少量的操作中获益,云提供商则以较少的计算资源高效地为大量用户提供服务。无服务器计算的实现流程:开发人员编码、上传、部署函数,选择触发事件,云提供商管理基础设施以及应用程序的伸缩、性能和计费。云计算将业务无关的管理和运维下沉到基础设施,使应用程序聚焦于业务功能的开发和运行,逐步演化出无服务器范式,无服务器计算使开发人员无需关注服务器,只要提交业务代码,就能得到相应的功能和服务。无服务器函数按实际调用的执行时间计费,对于工作负载不规则的应用程序是理想的选择。无服务器计算适合无状态、事件驱动和短运行时间的应用程序。

无服务器计算越来越普及,但该技术仍处于起步阶段,存在一定限制,阻碍了其广泛应用。目前的无服务器计算侧重于操作灵活性、异步和可伸缩性,不支持函数的直接组合,必须通过相应的云事件才能触发函数。一方面,这种限制是有益的,因为开发人员必须将函数设计为高度细粒度、可复用的组件。另一方面,开放性和细粒度增加了系统的复杂度,开发人员无法假设函数之间的顺序一致性或可串行性,使全局语义的推理变得复杂。

1 云原生技术

本质上,用户对云的期望是一个运行时环境,用户更关心业务逻辑,不关心或少关心技术逻辑,这也是云原生应用产生的背景。云原生技术有利于企业在公有云、私有云和混合云上构建和运行可弹性伸缩的应用。云原生的代表技术包括容器、微服务、服务网格、不可变基础设施和声明式API[7]。这些技术能构建容错性好、易于管理、便于测试的松散耦合系统,结合可靠的自动化手段,云原生技术使开发人员对应用程序做出频繁、可预测的变更。

容器是一种轻量的虚拟化技术,能提供可移植、可复用的模式打包、分发和运行应用程序,可以将不同应用程序的不同组件组装在一起,也可以将它们彼此隔离。容器技术简化了应用程序的分发和部署,是云原生应用的基石。微服务架构将应用程序按功能拆分成多个独立自治的微服务,每个微服务仅实现一种功能,具有明确的业务边界。微服务之间采用标准接口通信和交换数据,形成一种松散耦合的交互模式。服务网格是微服务网络基础设施,实现复杂网络中微服务之间的通信,调和微服务与外部应用程序,轻量级网络代理能可靠地实现微服务请求,提供网络弹性机制,与微服务部署在一起,但微服务感知不到,对业务应用是透明的[8]。不可变基础设施是指基础设施环境创建后不接受更新和修改,只能通过整体替换来创建和变更,保持基础设施的一致、可靠以及简单、可预测的部署过程。声明式API描述要达到的目标并提交给API服务器,由其负责实现目标,减少开发、运维人员的工作量,提高开发效率。

无服务器计算所具备的特征优势、技术优势和费用优势,将成为新一代云计算的发展方向,无服务器架构推进了云原生应用的开发,利用云计算的强大算力,使云原生应用成为企业业务助推器。云函数作为虚拟机、容器技术之后的下一代计算形态,将引发云计算新的热潮,围绕云函数构建的产品、工具、生态以及应用,也将带来新的发展,随着无服务器产品和生态走向成熟,将逐步承载企业核心业务。

2 无服务器计算

无服务器计算的主要特征是事件驱动、无状态、短运行时间、敏捷自动伸缩和低成本。无状态函数、云服务与数据对象存储的组合,扩大了应用程序的范围。由于其简单性、固有的弹性和计费模型,函数即服务正成为云计算中流行的模式。FaaS编程模型是基于事件的,可以触发函数响应特定的云事件,FaaS可视为反应式系统,具备四个必需的属性:响应性、恢复力、弹性和事件驱动。云函数和对象存储服务的分离促进了应用程序在并行处理海量数据时的弹性和灵活性。

无服务器计算是开发云原生应用软件的新方法。IBM将其定义为一种计算方法,将公共基础设施管理任务,如扩展、调度、恢复、资源调配等转移给云提供商,使开发人员将时间和精力集中在应用程序和业务逻辑上[9]。无服务器平台使开发人员专注于核心产品及其业务功能,而不是安装服务器、更新操作系统和运行时环境、管理访问控制策略、资源调配、调整程序大小、扩展和可用性等,云提供商负责管理基础设施和运行时环境,为用户制定精细的计费策略,降低了使用成本。开发人员不直接操作云基础设施,而是以函数的形式提供短时运行代码,由无服务器平台执行。对于高吞吐量应用程序,无服务器计算采用自动伸缩资源模式动态匹配负载峰值。

2.1 无状态云函数

无服务器计算是一种编程模型,代码在预先配置的云计算资源中按需执行,通过集中资源和管理运行平台,无服务器能跨多个物理服务器平衡工作负载实现高度弹性扩展。将无服务器代码与虚拟运行环境捆绑在一起的容器,可以在物理服务器之间部署,无服务器可以创建多个容器动态扩展应用程序的实例,为了实现这种方法,无服务器应用程序代码被组织成无状态的云函数。在无服务器计算中,计算单元是函数,函数没有状态,无状态可以实现自动伸缩,无服务器平台根据请求数伸缩函数实例。

在无服务器应用程序开发中,开发人员使用云提供商支持的编程语言将业务功能定义为无状态函数及其组合,Python和JavaScript是无服务器平台支持的常见脚本语言。无状态编程模型为开发人员提供了对应用程序的更多控制,允许他们透明地提供安全补丁并优化程序,动态扩展无服务器函数支持云弹性,无服务器函数不在运行时保存状态,但开发人员可以在函数中编写程序获取或更新需要的状态,还可以访问表示函数运行环境的上下文对象。由于使用了无状态、短时运行的函数,函数的资源并发度可以在函数级别而不是应用程序级别自动调整,函数的无状态性使平台能动态并发调用函数。

无服务器计算以函数作为其基本设计单元,无状态函数使开发人员能构建松散耦合的代码,无状态函数比有状态组件更易于水平扩展,增加了函数设计的灵活性。函数运行结束后,在函数生命周期内生成的状态数据全部自动删除,除非显式持久化到外部存储。函数是无状态和幂等的,当函数调用失败时,可以再次调用执行而没有副作用。开发人员设计函数时遵循单一职责原则(Single Responsibility Principle,SRP),一个函数仅完成一种任务,使函数更易于测试,运行更稳定,产生的错误和异常更少。无服务器计算以松散耦合模式集成无状态函数、第三方服务和微服务,构建易于开发、易于管理的复杂应用程序,拥有明确定义接口的无状态细粒度函数易于在无服务器架构中被复用。

2.2 事件驱动云函数

事件驱动由于其良好的解耦和可扩展的架构,成为分布式系统的骨干。无服务器计算是事件驱动的云执行模型,http请求、文件上传、数据库修改、消息发送等都可以定义为无服务器事件。云函数运行是事件驱动的,程序进程在事件触发时产生,在事件处理后终止,降低了执行事件驱动工作负载的操作成本和复杂度。无服务器函数与“监听-处理”类程序不同,不是一直在线,而是按需启动。

FaaS遵循事件驱动的方法,应用程序由函数组成,函数在事件触发时调用,开发人员可以定义函数及其依赖,而不受平台限制,函数部署到无服务器平台,为函数指定触发事件,当函数被触发时,代码加载到容器,在容器中运行,容器在函数运行结束后被移除或缓存以备将来复用,容器是无服务器范式的关键推动者之一。函数加载到容器中运行,代码更安全,且容器易于打包、部署和移除,每个容器进程运行在一个沙箱中,对其他容器不可见,容器被多个平台支持,可以跨平台移植。

无服务器计算的核心功能之一是事件驱动,如图1所示,平台管理一系列用户定义的函数,接收通过用户接口(User Interface,UI)、API网关、消息队列、对象存储、日志服务或云事件源(Cloud Event Sources,CES)产生的事件,确定向哪个函数发送事件,查找函数的现有实例或创建新实例,将事件传递给函数实例,等待响应,收集执行日志,将响应反馈给用户,运行结束终止该函数。平台必须快速有效地启动函数并处理其输入,对事件排队,根据队列的状态和事件分布,合理安排函数执行,终止空闲函数实例并释放资源,处理程序异常。

图1 事件驱动云函数及其函数实例并发

2.3 云函数弹性伸缩及其并发

无服务器应用程序可以快速、无缝地自动扩展,当并发用户数量增加或减少时,应用程序自动伸缩其规模,根据负载动态分配无服务器架构中的资源,使平台能应对突发的请求峰值。业务逻辑映射到函数计算中,业务高峰期,函数动态扩展支持业务高并发,这个过程不需要管理软硬件环境。针对业务请求数,平台自动弹性生成恰当的函数实例来承载实际业务量,当没有请求时,无实例运行。云函数由事件触发,触发启动的一个云函数实例仅实现一种具体的功能,在函数代码中不考虑并发,开发效率更高,云函数实例的高并发,提高了软件性能。

无服务器计算在执行过程中,根据请求数动态扩容函数满足用户需求,这个过程对用户是透明的。无服务器函数的无状态性使平台能动态扩展,当平台监测到缺少函数的运行实例,可以启动该函数的其他实例,通过并行执行多个函数实例动态处理业务负载峰值,如果有太多函数实例,可以终止空闲实例。无服务器以大规模并发模式执行云函数程序,响应事件驱动,实现业务高并发,如图1所示,云提供商负责配置和管理运行程序的弹性计算云服务器,为用户提供高可信、高弹性的云计算基础设施。

2.4 云函数冷启动

函数程序执行之前,需要分配服务器、启动容器、初始化相关代码、包、设置工作程序、在内存中加载函数,运行函数。无服务器函数收缩为零后,再次运行将引发冷启动。冷状态容器初始化需要消耗时间,当启动多个函数并且每个函数都需要初始化容器时,将导致大量的系统延迟。当容器处于暖状态时,在内存中已准备就绪,可以立即为用户请求提供函数服务,容器中函数实例运行结束后,可以为该容器分配新实例,也可以使用定时事件周期性地运行,保持容器为暖状态,减少冷启动[10]。函数执行时间是代码执行时间与初始化要执行的代码和容器所需的额外时间之和,通过优化函数调用资源,使用暖状态容器运行函数实例,减少额外时间[11]。用函数执行进程中保存的快照恢复、预热函数,减少函数副本的执行时间,降低总体延迟[12]。

当收到用户请求时,平台为用户的每个请求分配一个函数实例。用户首次请求触发函数时,平台立刻启动相关资源,这个过程将产生一定的冷启动时间。为减少冷启动,无服务器平台预先初始化一批不同规格的容器放在资源池中,当用户请求进入时,可以快速从资源池申请一个容器运行函数实例,从而降低资源申请的时间延迟。平台根据历史并发数据预测,为用户预留一定数量的容器,预先加载函数实例,不仅减少了冷启动,也提高了函数复用几率和动态伸缩性能。如果更新函数版本,则其后的函数请求都将重新冷启动,可以预先下载新版本函数并创建一些实例,逐步将用户请求平滑迁移到新版本函数。

2.5 云函数调用模式

无服务器为用户提供在资源池上构建和托管事件驱动应用程序的能力,应用程序工作流由一系列函数组成,由预定义的事件触发运行,根据用户请求动态分配资源。应用程序中的计算逻辑由函数表征,可以将函数与其他云服务组合在一起,创建业务工作流。无服务器中的应用程序工作流遵循事件驱动模型,函数由事件触发调用,由于函数无状态,可以独立伸缩。为确保开发人员将函数设计成小型独立的代码单元,平台对函数的大小和运行时环境进行了限制,以函数为基本粒度,降低了开发难度。

云函数异步调用执行模式主要有:序列模式、瀑布模式和并发模式。序列模式依次调用一系列函数,每个函数的运行结果在序列结束后,进行统一处理存入云数据库,如图2所示。瀑布模式依次执行一组函数,前一个函数的运行结果传递给下一个函数,最后一个函数的运行结果存入云数据库,如图3所示。如果函数可以并发执行而不需要等待其他函数结束,可以使用并发模式,每个函数的运行结果分别存入云数据库,如图4所示。

图2 云函数异步调用执行序列模式

图3 云函数异步调用执行瀑布模式

图4 云函数异步调用执行并发模式

3 无服务器架构及其云原生应用

无服务器计算是一种资源池化和资源利用的模型,包括操作系统、运行时环境和应用程序。无服务器计算被定义为一种软件架构,其中应用程序被分解为触发事件和动作函数,并且提供无缝托管和运行时环境。在无服务器计算中,云提供商管理数据中心、云函数、服务器、运行时环境、第三方服务和微服务。开发人员专注于价值密度更高的业务逻辑,将应用程序分解为多个相互依赖的函数集合,每个函数集合实现一部分业务功能,平台管理资源供给和分配,使整体业务轻量化。

无服务器架构可以分为两个部分:函数即服务FaaS和后端即服务(Backend as a Service,BaaS)。FaaS将服务端代码,从持久运行的组件演化成短时运行的函数实例。BaaS不再编写、管理服务端组件,通过业务领域通用的远程组件为用户提供服务,BaaS依赖于第三方服务和微服务,如加密、用户认证、云数据库及后端微服务,可以直接在应用程序中调用或者触发函数调用。开发人员编写函数部署到无服务器平台,不用持久运行进程等待HTTP请求或API网关调用,而是通过事件驱动触发函数运行。

无服务器平台根据工作负载管理资源的分配和释放,随着应用程序动态性和复杂性的增加,动态分配容器、监控服务和响应工作负载变化的任务越来越频繁,通过组合函数即服务和后端即服务,开发人员可以快速构建云原生应用软件。无服务器是自动弹性扩缩容的,业务高峰时,计算能力、容量自动扩展,承载更多的用户请求,业务下降时,所使用的资源同时收缩。无服务器函数是按需启动的,函数仅在事件触发时被加载运行,空闲状态下函数不占用计算资源。无服务器架构解耦基础设施与业务,应用程序被解构成若干个细粒度的无状态函数,开发人员聚焦于单任务函数的开发、迭代和升级,快速实现业务功能,缩短软件上市时间。

无服务器架构提供一种更小更灵活的动态容器,函数由事件触发在容器中运行,程序不需要编译,部署到平台就可以运行,开发人员重点关注业务流程、场景,以及对用户需求的快速理解、迭代和实现。无服务器架构及其云原生应用,如图5所示,在无服务器架构中,没有传统的后端,Web应用程序、Mobile APP、物联网(Internet of Things,IoT)设备等通过API网关与各种不同的函数进行通信,也可以通过事件触发器触发函数运行。API网关定义了路由和节点,每个路由与处理该路由的资源相关联。当API网关接收到请求时,查找与该请求匹配的路由配置,将HTTP请求参数映射到函数的输入,或者将HTTP请求作为JSON对象传递给调用函数,函数执行其业务逻辑并将结果返回到API网关,API网关将结果转换成HTTP响应,传递给原始调用方。

图5 无服务器架构及其云原生应用

用户可以直接和身份认证、云数据库、文件存储等第三方服务通信,获取相应的服务功能,不需要经过API网关,就可以在应用程序中调用,节省了开发时间。查询搜索微服务、支付微服务、数据分析微服务、通知微服务、日志微服务等可以通过事件触发函数,调用后端微服务集成到应用程序,为用户提供相应的业务功能。

4 结 语

无服务器计算是对网络资源、服务和运维体系的抽象,无服务器应用程序运行成本低、构建速度快、部署简单、自动按需扩展、节约成本和资源、细粒度、高效的软件设计和更好的容错性,被越来越多的企业和软件开发人员接受。在无服务器架构中,函数即服务为开发人员提供函数的编码、上传和部署,并在高性能云平台运行,微服务后端即服务化,使开发人员更加重视领域驱动设计。无服务器计算是一种新范式,切合云计算发展方向,为用户提供强大的基础设施和服务,无服务器函数的快速开发、迭代、升级和复用,提高了软件性能和开发效率。

未来低代码甚至零代码与无服务器的组合将是云计算的优先解决方案,利用低代码或零代码平台可视化实现通用服务,组合用户定制函数实现个性化服务。无服务器架构将成为新的云计算标准和最佳实践,是开发人员和企业的优选。

猜你喜欢
开发人员实例应用程序
删除Win10中自带的应用程序
Semtech发布LoRa Basics 以加速物联网应用
谷歌禁止加密货币应用程序
后悔了?教你隐藏开发人员选项
完形填空Ⅱ
完形填空Ⅰ
三星电子将开设应用程序下载商店
三星SMI扩展Java论坛 开发人员可用母语
微软软件商店开始接受应用程序