【问题标题】:How to close aws client in aws lambda如何在 aws lambda 中关闭 aws 客户端
【发布时间】:2021-08-16 20:13:39
【问题描述】:

我正在尝试使用将使用 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()

【问题讨论】:

  • 当整个容器关闭时,反正一切都销毁了。

标签: java amazon-web-services aws-lambda autocloseable


【解决方案1】:

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

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

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

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

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

【讨论】:

  • 明确引用的文档说将它们视为长期存在的。
  • 请注意引用中的最后一句话:为了获得最佳实践,请通过调用 close 方法显式关闭客户端。即使您没有明确关闭它,Lambda 也可以并且将会关闭它,但这并不意味着您应该这样做。在最好将客户端视为长寿命对象的情况下,您应该让 lambda 自动关闭它,即为了获得最佳性能,因为客户端通过保持在可重用连接池中来维护服务的套接字。在这种情况下,当再次调用 lambda 时,客户端可能会被重用。
  • @kayuapi_my 感谢您的回复。也许您可以建议我在哪里可以阅读有关 Lambda 关闭行为的更多信息,以更好地理解事情?
  • 当然,您可以在此处了解有关执行环境的更多信息:docs.aws.amazon.com/lambda/latest/dg/…
猜你喜欢
  • 2023-04-09
  • 2019-12-18
  • 1970-01-01
  • 2019-04-15
  • 2017-02-23
  • 1970-01-01
  • 2022-01-23
  • 2017-12-11
  • 2020-10-20
相关资源
最近更新 更多