【最不佳实践】Serverless应用优化四则

本文涉及的产品
Serverless 应用引擎免费试用套餐包,4320000 CU,有效期3个月
函数计算FC,每月15万CU 3个月
简介: Serverless架构下,虽让我们更多精力是关注我们的业务代码,但是实际上对于一些配置和成本也是需要进行关注的,并且在必要的时候,还需要根据配置与成本进行对我们的Serverless应用进行配置优化和代码优化。

Serverless架构下,虽让我们更多精力是关注我们的业务代码,但是实际上对于一些配置和成本也是需要进行关注的,并且在必要的时候,还需要根据配置与成本进行对我们的Serverless应用进行配置优化和代码优化。

资源评估依旧重要

Serverless架构虽然是按量付费的,但是并不代表他就一定比传统的服务器租用费用低,如果我们对自己的项目评估不准确,对一些指标设置不合理,Serverless架构所产生的费用可能是巨大的。

一般情况下FaaS平台的收费是和三个指标具有直接关系的:所配置的内存规格、程序所消耗的时间以及产生的流量费用。通常情况下程序所消耗的时间可能会与内存规格、程序本身所处理的业务逻辑有关,流量费用与程序本身和客户端交互的数据包大小有关,所以在这三个常见的指标准,可能因为配置不规范导致计费出现比较大偏差的就是内存规格,以阿里云函数计算为例,我们假设有一个Hello World的程序,每天都会被执行10000次,可以统计不同规格的实例所产生的费用(不包括网络费用):

image

通过上表可以看到,当我们的程序在128M规格的内存中可以正常执行,如果我们错误将内存规格设置成了3072MB时,可能每月产生的费用将会暴涨25倍!所以在我们进行Serverless应用上线之前,我们要对资源进行一定的评估,以便得到更合理的配置,来进一步降低我们的成本!

合理的代码包规格

在各个云厂商的FaaS平台中,都有着对代码包大小的限制,抛掉云厂商对代码包的限制,就单纯的说代码包的规格可能会产生什么影响,通过函数的冷启动流程可以看到:

image

在函数启动的过程中,有一个过程是加载代码的过程,那么当我们所上传的代码包过大,或者说文件过多导致解压速度过慢,就会直接导致加载代码这个过程变长,进一步直接导致冷启动时间变久。

可以设想一下,当我们有两个压缩包,一个是只有100KB的代码压缩包,另一个是200MB的代码压缩包,两者同时在千兆的内网带宽下理想化(即不考虑磁盘的存储速度等)下载,即使最大速度可以达到125MB/S,那么前者的下载速度只有不到0.01秒,后者需要1.6秒,除了下载时间之外,还有文件的解压时间,那么两者的冷启动时间可能就相差2秒。一般情况下,一个传统的Web接口,如果要2秒以上的响应时间,实际上对很多业务来说是不能接受的,所以在我们打包代码时就要尽可能的降低压缩包大小。以Node.js项目为例,打包代码包时,可以采用Webpack等方法,来压缩依赖包大小,进一步降低整体代码包的规格,提升函数的冷启动效率。

合理利用实例的复用

在各个云厂商的FaaS平台中,为了更好的解决冷启动的问题,为了更合理的利用资源,是存在“实例”复用情况的。所谓的实例复用,就是当一个实例完成一个请求,他并不会释放,而是进入一个“静默”的状态,在一定时间范围内,如果有新的请求被分配过来,则会直接调用对应的方法,而不需要再初始化各类资源等,这个过程很大程度上降低了函数冷启动的情况出现。为了验证,我们可以创建两个函数:

函数1:

# -*- coding: utf-8 -*-

def handler(event, context):
  print("Test")
  return 'hello world'

函数2:

# -*- coding: utf-8 -*-

print("Test")

def handler(event, context):
  return 'hello world'

我们在控制台多次点击测试按钮,对这两个函数进行测试,判断其是否在日志中输出了“Test”,我们可以统计结果:

image

根据上面的情况,我们可以看到,其实实例复用的情况是存在的,因为函数2并不是每次都会执行入口函数之外的一些语句。根据函数1和函数2,我们也可以进一步思考,如果print("Test")语句是一个初始化数据库连接,或者是加载一个深度学习的模型,是不是函数1的写法就是每次请求都会执行,而函数2的写法是可以存在复用已有对象的情况?

所以在实际的项目中,有一些初始化操作,是可以按照函数2来进行实现的,例如:

  • 机器学习场景下,在初始化的时候加载模型,避免每次函数被触发都会加载模型带来的效率问题,提高实例复用场景下的响应效率;
  • 数据库等链接操作,可以在初始化的时候进行链接对象的建立,避免每次请求都创建链接对象;
  • 其他一些需要首次加载时下载文件,加载文件的场景,在初始化的时候进行这部分需求的实现,可以在实例复用的时候效率更高;

善于利用函数特性

各个云厂商的FaaS平台都有一些“平台特性”,所谓的平台特性就是说这些功能可能并不是《CNCF WG-Serverless Whitepaper v1.0》中规定的能力,或者描述的能力,仅仅是作为云平台根据自身业务发展和诉求,从用户角度出发挖掘出来,并且实现的功能,可能只在某个云平台或者某几个云平台所拥有的功能,这类功能一般情况下如果利用得当会让我们的业务性能等有质的提升。

Pre-freeze & Pre-stop

以阿里云函数计算为例,在平台发展过程中,挖掘出用户痛点(尤其是都碍传统应用平滑迁移至Serverless架构):

  • 异步背景指标数据延迟或丢失:如果在请求期间没有发送成功,则可能被延迟至下一次请求,或者数据点被丢弃。
  • 同步发送指标增加延迟:如果在每个请求结束后都调用类似Flush接口,不仅增加了每个请求的延迟,对于后端服务也产生了不必要的压力。
  • 函数优雅下线:实例关闭时应用有清理连接,关闭进程,上报状态等需求。在函数计算中实例下线时机开发者无法掌握,也缺少Webhook通知函数实例下线事件。

根据这些痛点发布了运行时扩展(runtime extensions)功能。该功能在现有的HTTP服务编程模型上扩展,在已有的HTTP服务器的模型中增加了PreFreeze和PreStop webhooks。扩展开发者实现HTTP handler,监听函数实例生命周期事件

image

PreFreeze:在每次函数计算服务决定冷冻当前函数实例前,函数计算服务会调用HTTP GET /pre-freeze路径,扩展开发者负责实现相应逻辑以确保完成实例冷冻前的必要操作,例如等待指标发送成功等。函数调用InvokeFunction的时间不包PreFreeze hook的执行时间。

image

PreStop:在每次函数计算决定停止当前函数实例前,函数计算服务会调用HTTP GET /pre-stop路径,扩展开发者负责实现相应逻辑以确保完成实例释放前的必要操作,如关闭数据库链接,以及上报、更新状态等。

image

单实例多并发

众所周知,各个厂商的函数计算通常是请求级别的隔离,即当客户端同时发起三个请求到函数计算,理论上会产生三个实例来进行应对,这个时候可能会涉及到冷启动问题,可能会涉及到请求之间状态关联问题等,但是部分云厂商提供了单实例多并发的能力(例如阿里云函数计算),该能力允许用户为函数设置一个实例并发度(InstanceConcurrency),即单个函数实例可以同时处理多少个请求。

如图下图,假设同时有3个请求需要处理,当实例并发度设置为1时,函数计算需要创建3个实例来处理这3个请求,每个实例分别处理1个请求;当实例并发度设置为10时(即1个实例可以同时处理10个请求),函数计算只需要创建1个实例就能处理这3个请求。

单实例多并发的优势:

  • 减少执行时长,节省费用。例如,偏I/O的函数可以在一个实例内并发处理,减少实例数从而减少总的执行时长。
  • 请求之间可以共享状态。多个请求可以在一个实例内共用数据库连接池,从而减少和数据库之间的连接数。
  • 降低冷启动概率。由于多个请求可以在一个实例内处理,创建新实例的次数会变少,冷启动概率降低。
  • 减少占用VPC IP在相同负载下,单实例多并发可以降低总的实例数,从而减少VPC IP的占用。

单实例多并发的应用场景时比较广泛的,例如函数中有较多时间在等待下游服务的响应的场景就比较适合使用该种功能,但是单实例多并发也并不适合全部应用场景,例如当函数中有共享状态且不能并发访问的场景,单个请求的执行要消耗大量CPU及内存资源的场景,就不适合使用单实例多并发这个功能。

image

相关实践学习
【AI破次元壁合照】少年白马醉春风,函数计算一键部署AI绘画平台
本次实验基于阿里云函数计算产品能力开发AI绘画平台,可让您实现“破次元壁”与角色合照,为角色换背景效果,用AI绘图技术绘出属于自己的少年江湖。
从 0 入门函数计算
在函数计算的架构中,开发者只需要编写业务代码,并监控业务运行情况就可以了。这将开发者从繁重的运维工作中解放出来,将精力投入到更有意义的开发任务上。
目录
相关文章
|
5天前
|
存储 人工智能 Serverless
函数计算进化之路:AI 应用运行时的状态剖析
AI应用正从“请求-响应”迈向“对话式智能体”,推动Serverless架构向“会话原生”演进。阿里云函数计算引领云上 AI 应用 Serverless 运行时技术创新,实现性能、隔离与成本平衡,开启Serverless AI新范式。
137 12
|
1月前
|
运维 监控 Cloud Native
【云故事探索】NO.17:国诚投顾的云原生 Serverless 实践
国诚投顾携手阿里云,依托Serverless架构实现技术全面升级,构建高弹性、智能化技术底座,提升业务稳定性与运行效率。通过云原生API网关、微服务治理与智能监控,实现流量精细化管理与系统可观测性增强,打造安全、敏捷的智能投顾平台,助力行业数字化变革。
【云故事探索】NO.17:国诚投顾的云原生 Serverless 实践
|
5月前
|
SQL 分布式计算 Serverless
鹰角网络:EMR Serverless Spark 在《明日方舟》游戏业务的应用
鹰角网络为应对游戏业务高频活动带来的数据潮汐、资源弹性及稳定性需求,采用阿里云 EMR Serverless Spark 替代原有架构。迁移后实现研发效率提升,支持业务快速发展、计算效率提升,增强SLA保障,稳定性提升,降低运维成本,并支撑全球化数据架构部署。
527 56
鹰角网络:EMR Serverless Spark 在《明日方舟》游戏业务的应用
|
3月前
|
存储 编解码 Serverless
Serverless架构下的OSS应用:函数计算FC自动处理图片/视频转码(演示水印添加+缩略图生成流水线)
本文介绍基于阿里云函数计算(FC)和对象存储(OSS)构建Serverless媒体处理流水线,解决传统方案资源利用率低、运维复杂、成本高等问题。通过事件驱动机制实现图片水印添加、多规格缩略图生成及视频转码优化,支持毫秒级弹性伸缩与精确计费,提升处理效率并降低成本,适用于高并发媒体处理场景。
211 0
|
11天前
|
人工智能 Kubernetes 安全
重塑云上 AI 应用“运行时”,函数计算进化之路
回顾历史,电网的修建,深刻地改变了世界的经济地理和创新格局。今天,一个 AI 原生的云端运行时的进化,其意义也远不止于技术本身。这是一次设计哲学的升华:从“让应用适应平台”到“让平台主动理解和适应智能应用”的转变。当一个强大、易用、经济且安全的 AI 运行时成为像水电一样的基础设施时,它将极大地降低创新的门槛。一个独立的开发者、一个小型创业团队,将有能力去创造和部署世界级的 AI 应用。这才是技术平权的真谛,是激发全社会创新潜能的关键。
|
1月前
|
运维 监控 Cloud Native
【云故事探索】NO.17:国诚投顾的云原生 Serverless 实践
通过与阿里云深度合作,国诚投顾完成了从传统 ECS 架构向云原生 Serverless 架构的全面转型。新的技术架构不仅解决了原有系统在稳定性、弹性、运维效率等方面的痛点,还在成本控制、API 治理、可观测性、DevOps 自动化等方面实现了全方位升级。
|
5月前
|
存储 运维 Serverless
千万级数据秒级响应!碧桂园基于 EMR Serverless StarRocks 升级存算分离架构实践
碧桂园服务通过引入 EMR Serverless StarRocks 存算分离架构,解决了海量数据处理中的资源利用率低、并发能力不足等问题,显著降低了硬件和运维成本。实时查询性能提升8倍,查询出错率减少30倍,集群数据 SLA 达99.99%。此次技术升级不仅优化了用户体验,还结合AI打造了“一看”和“—问”智能场景助力精准决策与风险预测。
513 69
|
运维 Cloud Native 关系型数据库
活动回顾|阿里云 Serverless 技术实战与创新成都站回放&PPT下载
7月29日“阿里云 Serverless 技术实战与创新”成都站圆满落幕。可免费下载成都站|阿里云 Serverless 沙龙演讲 PPT。
|
人工智能 弹性计算 运维
阿里云宣布 Serverless 应用引擎 SAE2.0 将公测上线,多款产品全新升级
阿里云宣布 Serverless 应用引擎 SAE2.0 将公测上线,多款产品全新升级
70536 53

相关产品

  • 函数计算