Serverless 技术已经成为了现代应用开发中的重要组成部分。由于 Serverless 应用无需配置和管理服务器,这种方式极大地减少了开发时间和开发成本。然而,当应用存在暂时不活跃(如被用户忽略)的时间段之后,因为所有的函数都是无状态服务的,新的请求会启动一个新的容器来运行函数。这种冷启动过程需要加载依赖和初始化环境等步骤,这可能会导致慢的性能和用户体验质量下降。
一些优化方法需要考虑许多因素,例如采用什么样的运行时版本、使用什么样的依赖解析与压缩工具等等。下文将介绍几种流行的 Serverless 冷启动优化方式。
使用缓存
有时候,应用程序有大量共享的初始化数据,如数据库连接、认证令牌等。服务器状态数据和进程缓存一般会被永久存储在硬盘中,但是每个容器的文件系统都是临时性的,处理请求的容器不能访问另一个容器的本地文件系统。不过,我们可以使用云服务提供的内存缓存机制(如 AWS Lambda 提供的 AWS Cache)来解决此类问题。通过缓存功能,可以省去冷启动的初始化过程。下面是一个示例代码:
-- -------------------- ---- ------- ------ ----- --- -------------- --------- ------------ - --------------------------------------- ---------- ------------ - -------------------------------- - ------- ------------ ---------------------- -- ------------ -- ----- ------------ - ------------------ -------------------------------- ------------- ------- ------ ---------------- -------------
使用预热机制
如果一个函数处于休眠状态,那么在调用该函数时会浪费时间进行加载。当函数实例 处于休眠状态时,可以定期唤醒这些实例,以防止后续请求时必须等待实例创建和启动。此外,预热机制也有助于减少网络延迟,提高应用程序的性能,并保证有足够的容器资源处于活动状态。
-- -------------------- ---- ------- ------ ---- ---- ---- ------ ----- --- -------------- --------- - ---- -------- ------ - ------------- ---- ------- ----------------- ---- --------- -
选择轻量级运行时环境
Serverless Provider 都提供了丰富的运行时环境选择。在使用 Serverless 应用程序时,不同的运行时环境可以在某些特定场景下帮助减少冷启动时间。基于微容器技术的环境,如 AWS Lambda 使用的 Firecracker,可以在运行函数代码之前快速启动容器。所以选择一个轻量级的运行时环境,对于优化冷启动的等待时间是有帮助的。
优化包大小
云平台在启动一个函数时,需要下载并安装运行时环境,因此包大小越大,启动时间就越长。减少包大小可以加快启动速度,从而减少冷启动的等待时间。缩小包大小的方法包括:
- 删除未被使用的依赖包
- 确认在需要覆盖到运行时的类、模块和文件已放在了合适的路径上(编写可执行的脚本获取输出内容)
- 将代码文件的体积减少到最低限度,并使用 gzip 进行压缩,从而减少下载时间
-- -------------------- ---- ------- ------ -------- ------ ---- ------ -- ------ ------- --- -------------- --------- -- --------------------------------- ------------- -- ----------------- --------------------------- --------------------------- - ------ -------------- ------- -------- -- ----------------- -------- - ----------------------------------------------------------- ---- - --------------- ------ - ------------- ---- ------- ----------------- ---------- ---------------- ------------------- -
合理的函数配置
针对 Serverless 应用程序在调用时经常会出现的短暂等待时间,可以通过以下几点进行优化:
- 增加合理的内存大小
- 可以预先定义 warm-up 请求,使得容器处于就绪状态
- 合理地设置超时时间,过长或过短都会影响性能
-- -------------------- ---- ------- -------- -------------------- --------- ----- --- -------- --------- ------------ ----------------- ------ ----------- --- -------- - ---------- ------ -------- ------------- ------ -------- -------------
结论
在开发 Serverless 应用程序时,优化冷启动时间是十分必要的事情。在本文中,我们介绍了几个非常有用的优化手段,包括使用缓存、使用预热机制、选择轻量级运行时环境、优化包大小、合理的函数配置。通过实现这些优化措施,可以在极大程度上缩短冷启动等待时间,从而提高 Serverless 应用的性能,增强用户体验。
来源:JavaScript中文网 ,转载请注明来源 https://www.javascriptcn.com/post/67091882d91dce0dc87654eb