首页 > 解决方案 > 如何在 aws lambda 中关闭 aws 客户端

问题描述

我正在尝试使用将使用 aws sdk SqsClient 和 SnsClient 的 Java 正确编写 aws lambda。我看到这些客户端实现close()了方法,当不再需要客户端时调用此方法通常是一个好习惯。以及 lambda ( https://docs.aws.amazon.com/lambda/latest/dg/best-practices.html )的最佳实践建议

在函数句柄之外初始化 SDK 客户端和数据库连接

所以,我的问题是:aws lambda 是否足够明智地自动关闭 aws sdk 客户端,这样我就可以编写这样的东西,并且不用担心在关闭 lambda 容器时显式关闭客户端。

public class SQSProcessingHandler implements RequestHandler<String, String> {

    private SqsClient sqsClient = SqsClient.create();

    @Override
    public String handleRequest(final String event, final Context context) {
        ListQueuesResponse response = sqsClient.listQueues();
        return response.queueUrls().stream().collect(Collectors.joining(","));
    }
}

如果仍需要显式关闭,请您帮我找出如何知道 lambda 容器即将关闭,以便我应该致电close()客户端?

标签: javaamazon-web-servicesaws-lambdaautocloseable

解决方案


为获得最佳实践,您应该明确关闭客户端,除非您有理由不这样做。

SDK 中的服务客户端是线程安全的。为了获得最佳性能,请将它们视为长寿命对象。每个客户端都有自己的连接池资源,当客户端被垃圾回收时会释放这些资源。AWS SDK for Java 2.0 中的客户端现在扩展了 AutoClosable 接口。要获得最佳实践,请通过调用 close 方法显式关闭客户端。

不明确关闭客户端的原因:

为获得最佳性能,请勿显式关闭客户端。这是因为未关闭的客户端通过在打开后保留在可重用连接池中来维护与服务的套接字。因此,当再次调用 lambda 时,客户端可能会被重用。Lambda 可以并且会在以后自动为您关闭客户端,即使您没有明确关闭它。

参考:https ://docs.aws.amazon.com/sdk-for-java/latest/developer-guide/creating-clients.html


推荐阅读