首页 > 其他分享 >Serverless面临的挑战

Serverless面临的挑战

时间:2023-01-26 11:46:12浏览次数:46  
标签:Serverless 预热 函数 挑战 面临 实例 池化 冷启动

在Serverless架构为使用者提供全新的编程范式的同时,当用户在享受Serverless带来的第一波技术红利的时候,Serverless的缺点也逐渐地暴露了出来,例如函数的冷启动问题,就是如今颇为严峻且备受关注的问题。

由于Serverless架构具有弹性伸缩的能力,Serverless服务的供应商会根据用户服务的流量波动进行实例的增加或缩减,其示意图如图1-16所示。

 

 

 

图1-16 函数计算根据流量进行函数扩缩示意图

以阿里云函数计算为例,当系统接收到第一个触发函数的事件时,它将启动一个容器来运行代码。如果此时收到了新的事件,而第一个容器仍在处理上一个事件,平台将启动第二个代码实例来处理第二个事件,Serverless架构的这种自动的零管理水平缩放,将持续到有足够的代码实例来处理所有的工作负载为止。当然,不仅仅是并发情况下会比较容易触发函数冷启动,在函数的前后两次触发时间间隔超过了实例释放时间的阈值时,也会触发函数的冷启动,如图1-17所示。

 

 

 

图1-17 函数冷启动产生示意图

然而这里就涉及一个问题,当新的请求或者说是事件到来时,在广义上可能出现以下两种情况。

  • 存在空闲且可以直接复用的实例:热启动。
  • 不存在空闲且可以直接复用的实例:冷启动。

在本地执行一个函数,通常情况下是环境都已经准备妥当,每次执行只需要执行函数对应的方法即可,但是Serverless架构下并不是,本地与FaaS的函数调用区别示意图如图1-18所示。

 

 

 

图1-18 本地与FaaS的函数调用区别示意图

在Serverless架构下,开发者提交代码之后,通常情况下,代码只会被持久化,并不会为其准备执行环境,所以当函数第一次被触发时会有一个比较漫长的准备环境的过程,这个过程包括把网络的环境全部打通、将所需的文件和代码等资源准备好,这个从准备环境开始到函数被执行的过程被称为函数的冷启动。

New Relic网站上曾发表过一篇研究AWS Lambda冷启动时间的文章,其分析图如图1-19所示。

 

 

 

图1-19 AWS Lambda的冷启动时间研究和分析图

研究结果表明,当对AWS Lambda发起请求时,大部分的请求都落在了50ms以内,但还是有很多请求超过100ms甚至是150ms,这也充分说明了冷启动的存在。不同厂商对于冷启动的优化程度是不同的,曾有人对AWS Lambda、Azure Function以及Google Cloud Function三个工业级的Serverless架构产品进行过冷启动测试,并将函数启动划分成四个部分,如图1-20所示。

 

 

 

图1-20 函数启动的四个部分

通过这四个部分,其实可以简单地区分出冷启动和热启动的区别。冷启动包括准备环境的过程,就是当请求或者事件到来但没有可复用的实例资源时,系统将会初始化环境,包括网络环境、实例资源等,之后进行一些文件的下载、系统配置,然后再装载代码和一些依赖,最后执行代码。而热启动流程更短,它更多出现在厂商完成了实例的预热或实例的复用的情况下,相对冷启动而言,它的环境、配置、代码都是准备好的,只需要执行代码即可。通常情况下,热启动都是毫秒级启动,而冷启动可能是百毫秒级、秒级。不仅不同厂商对于冷启动的优化程度不同,同一厂商对不同语言的冷启动优化、对同一种语言下不同依赖的优化都是不同的,这也充分说明各厂商也在通过一些规则和策略努力降低冷启动率。

如图1-21所示,通常情况下,冷启动的解决方案包括几个部分:实例复用、实例预热以及资源池化。

 

 

 

图1-21 函数冷启动常见解决方案

从资源复用层面来说,对实例的复用相对来说比较重要,一个实例并不是在触发完成之后就结束其生命周期,而是会继续保留一段时间。在这段时间内如果函数再次被触发,那么可以优先分配该实例来完成相应的触发请求。在这种情况下可以认为函数的所有资源是准备妥当的,只需要再执行对应的方法即可,所以实例复用是大多数厂商都会采取的一个降低冷启动率的措施。在实例资源复用的方案中,实例静默状态下要被保留多久取决于厂商对成本的考量。保留时间过短会导致请求出现较为严重的冷启动问题,影响用户体验;实例长期不被释放则很难被合理地利用起来,会大幅度提高平台整体成本。

从预热层面来说,解决函数冷启动问题可以通过某些手段判断用户的函数在下一个时间段可能需要多少实例,并且进行实例资源的提前准备。函数预热的方案是大部分云厂商所重视并不断深入探索的方向,常见的预热方案如图1-22所示。

 

 

 

图1-22 函数预热常见方案

1)被动预热通常指的是非用户主动行为预热,是系统自动预热函数的行为,主要包括规则预热、算法预热以及混合预热,所谓的规则预热是指设定一个实例数量范围(例如每个函数同一时间点最低0个实例,最多300个实例),然后通过一个或几个比例关系进行函数下一时间段的实例数量的扩缩。例如设定某个比例为1.3倍,当前实例数量为110,实际活跃实例数量为100,那么实际活跃数量乘以所设定的比例的结果为130个实例,与当前实际存在时110个实例相比需要额外扩容20个实例,那么系统就会自动将实例数量从110个提升到130个。这种做法在实例数量较多和较少的情况下会出现阔缩数量过大或过小的问题(所以有部分厂商引入不同实例范围内采用不同的比例来解决这个问题),在流量波动较频繁且波峰波谷相差较大的时候,该方案会出现预热滞后的问题。算法预热实际上是根据函数之间的关系、函数的历史特征进行,通过深度学习等算法进行下一时间段的实例的扩缩操作,但是在实际生产过程中,环境是非常复杂的,对流量进行一个较为精确的预测非常困难,所以算法预测的方案是很多人在探索但却迟迟没有落地的一个重要原因。还有一种方案是混合预热,即将规则预热与算法预热进行一个权重划分,共同预测下一时间段的实例数量,并提前决定扩缩行为和扩缩数量等。

2)主动预热通常指的是用户主动进行预热的行为。由于被动预热在复杂环境下的不准确性,所以很多云厂商提供了用户手动预留的能力,目前来说主要分为简单配置和指标配置两种。所谓的简单配置就是设定预留的实例数量,或者某个时间范围内的预留实例数量,所预留的实例将会一直保持存活状态,不会被释放掉。另一种是指标配置,即在简单配置基础上,可以增加一些指标,例如当前预留的空闲容器数量小于某个值时进行某个规律的扩容,反之进行某个规律的缩容等。通常情况下,用户主动预留模式比较适用于有计划的活动,例如某平台在双十一期间要进行促销活动,那么可以设定双十一期间的预留资源以保证高并发下系统良好的稳定性和优秀的响应速度,通常情况下主动预留可能会产生额外的费用。

3)混合预热,即将被动预热和主动预热按照一个权重关系进行结合。如果用户配置了主动预热规则,就执行主动预热规则,辅助被动预热规则;如果用户没有配置主动预热规则,就使用默认的被动预热规则。

最后一种解决冷启动问题的方法是资源池化,但是通常情况下这种所谓的资源池化带来的效果可能不是热启动,可能是温启动。所谓的温启动是指实例所需要的相关资源已经提前准备了,但是并没有完全准备好的情况。所谓的池化就是在实例从零到一的过程中所进行的每一步准备工作,如图1-23所示。

 

 

 

图1-23 函数池化程度示意图

池化的好处是可以降低实例启动的链路出现完全冷启动的概率,例如VPC层面的池化,可以避免底层资源准备时产生的时间消耗,让启动速度更快。同时池化也可以更加灵活地面对更多情况,例如在运行时层面的池化,可以将池化的实例分配给不同的函数,不同函数被触发的时候,可以优先使用池化资源,达到更快的启动速度。当然池化也是一门学问,例如池化的资源规格、运行时的种类、池化的数量以及资源的分配和调度等。

通常情况下,在冷启动的过程中,比较耗时的环节包括网络资源的打通、实例的底层资源的准备以及运行时等准备。除此之外,对一个实例冷启动有一定影响的还有代码包的大小,过大的代码包可能会导致下载代码时间变长,进一步导致冷启动现象严重。

除了冷启动之外,Serverless架构还存在着厂商锁定等比较严重的问题。厂商锁定问题是很多人非常在意的,由于函数计算需要依靠事件触发,所以事件源以及函数本身与事件源规约的数据结构就显得格外重要。以对象存储为例,对象存储与函数计算所规约的数据结构,不同厂商的数据格式就是不同的。

这就意味着业务逻辑可能需要针对不同厂商进行适配,除此之外很多事件源是不能跨运营商触发的,所以这对业务迁移、多云部署等操作实际上是有一定影响的。

除了厂商锁定之外,Serverless目前缺少完备的开发者工具,这也是比较大的问题,会在不同程度上影响函数的调试和部署、依赖的安装、相关日志的查看以及函数资源的管理。为了改善这个问题,目前各个云厂商都在针对自身产品的特点建立自己的工具链体系,例如AWS Lambda的SAM、阿里云函数计算的Funcraft等。当然,除了各个厂商自己针对自身所推出的开发者工具,也有一些通用性比较强的多云Serverless开发者工具,例如阿里云开源的Serverless Devs等。

综上所述,Serverless架构拥有诸多优点,也面临一些困难和挑战,包括但不限于函数冷启动问题严重、开发工具不完善、厂商锁定严重等问题。Serverless架构虽然已出现了很多年,但是真正步入“元年”并得以快速发展的时间其实还是比较短的,但不可否认的是,近些年Serverless架构的热度在持续上升,人们对它寄予厚望,各个厂商对其投入也非常大,目前所遇到的问题也都是短暂的,Serverless架构会朝着更好用、更易用的方向不断演进。

 

标签:Serverless,预热,函数,挑战,面临,实例,池化,冷启动
From: https://www.cnblogs.com/muzinan110/p/17067648.html

相关文章

  • Serverless架构下用Python轻松实现图像分类和预测
    Serverless架构下用Python轻松实现图像分类和预测图像分类是人工智能领域的一个热门话题。通俗解释就是,图像分类是一种根据各自在图像信息中所反映的不同特征,把不同类别的......
  • Serverless 触发器和函数赋能自动化运维
    Serverless架构在运维层面有着得天独厚的优势,不仅因为其事件触发可以有针对性地获取、响应一些事件,还因为其轻量化、低运维的特性让很多运维开发者甚是喜爱。在实际生产中......
  • Serverless与监控告警、自动化运维
    通过Serverless架构实现监控告警功能在实际生产中,经常需要编写一些监控脚本来监控网站服务或API服务的健康状况,包括是否可用、响应速度是否足够快等。传统的方法是直接使......
  • Serverless Workflow
    ServerlessWorkflowServerlessWorkflow(Serverless工作流)是一个用来协调多个分布式任务执行的全托管云服务。如图4-21所示,在Serverless工作流中,用户可以用顺序、分支、......
  • Serverless可观测性
    4.3.3可观测性Serverless应用的可观测性是被很多用户所关注的。可观测性是通过外部表现判断系统内部状态来衡量的。在应用开发中,可观测性帮助用户判断系统内部的健康状......
  • Serverless应用优化
    Serverless应用优化4.4.1资源评估依旧重要Serverless架构虽然是按量付费的,但是并不代表它就一定比传统的服务器租用费用低。如果对自己的项目评估不准确,对一些指标设置......
  • Serverless传统Web框架迁移
    与其说Serverless架构是一个新的概念/架构,不如说它是一个全新的思路、一种新的编程范式。在这种新的架构或者说新的编程范式下,使用全新的思路来做Serverless应用是再好不过......
  • Serverless经验积累
    1.Web框架与阿里云函数计算由于阿里云函数计算拥有HTTP函数的优势,传统的Web框架部署到阿里云函数计算是非常方便的。对于Bottle和Flask这类的框架,从用户请求到框架本身,......
  • 开发一个Serverless应用
    通过Serverless架构建立一个函数,并输出了HelloWorld,表明已经完成Serverless架构的初体验。接下来,我们以其中一个云厂商为例(例如阿里云)进行基础的小工具开发和建设,帮助读者......
  • Serverless架构下的前后端一体化
    天下大势,分久必合,合久必分。其实,技术的发展也遵循此规律。以Web应用的前后端为例,从前后端一体化到前后端分离,是为了解决高可用、高并发的问题;从前后端分离到前后端一体化,则......