使用 Lambda 处理唯一性 SnapStart
在 SnapStart 函数上扩展调用时,Lambda 使用单个初始化的快照来恢复多个执行环境。如果您的初始化代码生成了唯一内容,而此内容包含在快照中,则跨执行环境重复使用该内容时,该内容可能不唯一。要在使用时保持唯一性 SnapStart,必须在初始化后生成唯一的内容。这包括唯一的 ID、唯一的密钥和用于生成伪随机性的熵。
我们推荐使用以下最佳实践来帮助您保持代码的唯一性。Lambda 还提供开源SnapStart 扫描工具,以帮助检查假设唯一性的代码。如果您在初始化阶段生成唯一的数据,则可以使用运行时挂钩来还原唯一性。使用运行时挂钩,您可以在 Lambda 拍摄快照之前立即运行特定代码,也可以在 Lambda 从快照恢复函数后立即运行特定代码。
避免在初始化期间保存依赖唯一性的状态
在函数的初始化阶段,避免缓存旨在保持唯一性的数据,例如生成用于日志记录的唯一 ID。相反,我们建议您在函数处理程序中生成唯一的数据或使用运行时挂钩。
例 – 在函数处理程序中生成唯一的 ID
以下示例演示如何在函数处理程序中生成 UUID。
import java.util.UUID; public class Handler implements RequestHandler<String, String> { private static UUID uniqueSandboxId = null; @Override public String handleRequest(String event, Context context) {
if (uniqueSandboxId == null) uniqueSandboxId = UUID.randomUUID();
System.out.println("Unique Sandbox Id: " + uniqueSandboxId); return "Hello, World!"; } }
使用加密安全的伪随机数生成器(CSPRNG)
如果您的应用程序依赖随机性,我们建议您使用加密安全的随机数生成器(CSPRNG)。适用于 Java 的 Lambda 托管运行时包括两个内置的 csprNG(openSSL 1.0.2 java.security.SecureRandom
和),它们可以自动保持随机性。 SnapStart始终从中获取随机数/dev/random
或/dev/urandom
同时保持随机性的软件。 SnapStart
例 — java.security。 SecureRandom
以下示例使用 java.security.SecureRandom
,即使函数从快照中恢复,它也会生成唯一的数字序列。
import java.security.SecureRandom; public class Handler implements RequestHandler<String, String> {
private static SecureRandom rng = new SecureRandom();
@Override public String handleRequest(String event, Context context) { for (int i = 0; i < 10; i++) { System.out.println(rng.next()); } return "Hello, World!"; } }
SnapStart 扫描工具
Lambda 提供扫描工具,以帮助您检查假设唯一性的代码。 SnapStart 扫描工具是一个开源SpotBugs
要详细了解如何使用处理唯一性 SnapStart,请参阅 Amazon Compute 博客Amazon Lambda SnapStart上的 “更快地启动