一句话概要:对 Lambda 环境变量的任何改动都会引起一次 Lambda 的冷启动,大可放心在 handleRequest(...) 方法外使用环境变量。
从 AWS 上 Java Lambda 应用记要 中,我学到了 Lambda 的实例是跨请求共享的,所以为使用 Lambda 配置的环境变量时曾写出了下面复杂而多余的 AWS Lambda 代码:
public class Handler implements RequestHandler<SNSEvent, String> {
private int threadPoolSize = getThreadPoolSizeFromEnv();
private ExecutorService threadPool = Executors.newFixedThreadPool(threadPoolSize);@Override
public String handleRequest(SNSEvent snsEvent, Context context) {int configuredThreadPoolSize = getThreadPoolSizeFromEnv();
if(configuredThreadPoolSize != threadPoolSize) {
threadPoolSize = configuredThreadPoolSize;
threadPool = Executors.newFixedThreadPool(threadPoolSize);
}return "Hello Lambda";
}private int getThreadPoolSizeFromEnv() {
return Integer.parseInt(System.getenv().getOrDefault("threadpool_size", "50"));
}
}
这段代码看起来很在理,既然 Lambda 实例是共享的,那么在必变环境变量之后就可能不会重新初始始化实例,所以在每次的请求方法中对比如果环境变量值改动了就重新用最新的配置值来初始化线程池。然而上面的代码结结实实是多余的,真是把 Lambda 想得太简单了,如果是很多环境变量岂不是逐一判断。 阅读全文 >>
本文探讨了AWS Lambda环境中环境变量的变化如何触发冷启动,并解释了一段关于如何根据环境变量调整线程池大小的Java代码为何是多余的。作者强调Lambda实例会跨请求共享,但对环境变量的改动会强制进行冷启动。
737

被折叠的 条评论
为什么被折叠?



