【问题标题】:Should LambdaClient object be shared?应该共享 LambdaClient 对象吗?
【发布时间】:2021-07-03 06:41:17
【问题描述】:

我有一个关于 Java 中的 AWS lambda 函数客户端的问题。现在,我将我的函数调用如下:

fun invokeMyLambda(){
    client=LambdaClient.builder().build()
    client.invoke()
}

但我认为在每次调用时构建客户端并不是一个好习惯。不幸的是,我在Amazon JavaDoc 中也找不到任何有用的信息。我真的不知道我是否可以像这样重用客户端:

val client=LambdaClient.builder().build()

fun invokeMyLambda(){
    
    client.invoke()
}

它是线程安全的吗?我应该创建一个客户池吗?我不是很清楚。

【问题讨论】:

  • 这看起来不像 java。是科特林吗?
  • @FedericoklezCulloca 是的。但这并不重要。认为它是伪代码。重要的是该库是用 Java 编写的。
  • 好的。我在生产中检查了它。不要在每次调用时都创建 AWS lambda 客户端,因为这会导致 OOM 问题。创建一次并重复使用。

标签: java aws-lambda


【解决方案1】:

LambdaClient 必须在内部使用 HttpClient。并且 HttpClients 被设计为线程安全的并且可以被共享。但是,如果不检查 LambdaClient 内部使用的内容,确实很难确定地回答这个问题。我向您推荐的是检查反编译器内部使用的 LambdaClient (IntelliJ 可以工作)。而且很可能您会发现内部使用了一个线程安全的 HttpClient。

例如 https://hc.apache.org/httpclient-legacy/performance.html#:~:text=HttpClient%20is%20fully%20thread%2Dsafe,connection%20manager%20such%20as%20MultiThreadedHttpConnectionManager.&text=At%20the%20same%20time%20the,all%20threads%20for%20maximum%20efficiency.

重用 HttpClient 实例 通常建议每个通信组件甚至每个应用程序都有一个 HttpClient 实例。但是,如果应用程序很少使用 HttpClient,并且不保证在内存中保留一个空闲的 HttpClient 实例,那么强烈建议在释放 HttpClient 实例之前显式关闭多线程连接管理器。这将确保正确关闭连接池中的所有 HTTP 连接。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2021-08-11
    • 1970-01-01
    • 2011-04-12
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多