一句话概要:对 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 想得太简单了,如果是很多环境变量岂不是逐一判断。 阅读全文 >>