如何减少 Java Lambda 函数的初始化和调用持续时间延迟?

1 分钟阅读
0

我的 Java AWS Lambda 函数执行得不太理想。为什么会发生这种情况,如何减少 Java 函数的初始化和持续时间延迟?

简短描述

可能导致 Java Lambda 函数产生高延迟的主要因素有二:

Java 虚拟机 (JVM) 类加载延迟

为了减少内存使用,JVM 会延迟 Java 类库的初始化,直到应用程序中首次调用该库。这种延迟可能会导致大量输入输出 (I/O) 操作,从而导致 Lambda 执行环境中首次调用的持续时间延迟更长。

Java 反射 API

Java 反射 API 允许 Java 代码发现有关其他类、接口、字段和方法的信息,然后对它们下层值进行操作。由于反射涉及动态解析的类型,因此无法执行某些 JVM 优化。因此,反射性操作比同类的非反射性操作要慢。

为了优化 Java Lambda 函数的性能,您可以执行本文中介绍的一个或多个最佳实践。

**注意:**要查看特定案例研究,请观看 AWS re:Invent 2019:AWS Lambda 和 Java 的最佳实践

解决方法

为 Lambda 函数配置预置并发

预置并发初始化请求数量的执行环境,以便它们准备好立即响应函数的调用。要为函数设置预置并发,请按照配置预置并发中的说明进行操作。

有关更多信息,请参阅管理 Lambda 函数的并发

**注意:**配置预置并发会向您的 AWS 账户收取费用。您可以在函数的某个版本或 Lambda 函数别名上配置预置并发。

在函数处理程序之外初始化函数的静态逻辑

当您初始化 Lambda 函数时,Lambda 会分配突增的主机 CPU 容量,最多持续 10 秒钟。由于 CPU 容量突增,最佳实践是在函数处理程序之外执行以下操作:

  • 导入库和依赖项
  • 设置配置
  • 初始化与其他服务的连接

这种静态初始化允许这些资源在每个沙箱中初始化一次,然后在执行环境中将来的所有调用中重复使用。

有关更多信息,请参阅优化静态初始化

对函数处理程序之外的任何延迟加载的库进行 API 调用

为了避免在初始化过程中延迟加载库,您可以对函数处理程序之外的任何延迟加载的库进行虚拟 API 调用。这些虚拟将调用初始化库并预热正在使用的 SDK。

**注意:**如果 Lambda 没有成功调用 API 所需的信息,对延迟加载库的虚拟调用可能会失败。如果调用失败,请确保捕捉到该错误。

减少 Lambda 代码中的反射操作

反射性操作比同类的非反射性操作要慢。避免经常调用的代码部分中包含反射性操作。

减少应用程序中类的数量

将部署程序包的大小缩小到运行时的必要值可以减少调用函数所需的时间。

有关更多信息,请参阅使用 AWS Lambda 函数的最佳实践

提前设置 Lambda 函数的配置参数

提前设置函数的配置参数可以缩短函数的调用和持续时间延迟。如果您没有在代码中指定配置变量,那么 Lambda 需要更多时间来发现函数的默认变量。

有关更多信息,请参阅使用 AWS Lambda 函数的最佳实践中的函数代码部分。

更新到 AWS Java 开发工具包 2.0

有关更多信息,请参阅优化 AWS Java 开发工具包 2.x 以缩短启动时间

**注意:**默认情况下,AWS Java 开发工具包 2.0 包括 Apache HTTP 客户端Netty HTTP 客户端以及 Java HTTP URL 连接客户端。如果您的使用案例不需要 Apache 和 Netty HTTP 客户端,则最佳实践是从部署程序包中删除这些客户端。


AWS 官方
AWS 官方已更新 3 年前