AWS Java SDK - 什么更快?单个 DynamoDB 客户端实例 (@ApplicationScoped) 还是为每个请求创建一个新实例?

AWS Java SDK - What's faster? A single instance of DynamoDB client (@ApplicationScoped) or creating a new one for every request?

我们有一个服务器应用程序 read/write 在 DynamoDB 中大量并行。

今天我们为每个注入点(CDI 依赖范围)注入一个新的 DynamoDB 和新的 AmazonDynamoDBClient。大多数情况下,我们应用程序中的新请求会注入一个 DynamoDB 实例。

我知道 DynamoDB 是线程安全的,我可以将其范围更改为 @ApplicationScoped,但对 DynamoDB 端点的请求将是串行的,这会降低我的应用程序的性能?或者甚至拥有一个 DynamoDB 实例,它可以同时处理对 AWS DynamoDB 端点的请求?

谢谢

所有 AWS 服务的客户端都在后台使用 HTTP 调用。因此,无论您使用哪种服务,对于这个问题,DynamoDB 的答案都是一样的,AWS 建议对多个请求使用单个客户端 实例。

这是一个 AWS 论坛问题 https://forums.aws.amazon.com/thread.jspa?messageID=247661(可能需要登录),其中讨论了这个问题。引用答案。

Each instance of one of the SDK clients (ex: AmazonS3Client) creates its own client object for sending HTTP requests, which can be relatively expensive since it manages resources like HTTP connection pools.

You'll get more efficient use of your resources by reusing the same S3 client object.

As you put more load through the client, you might also take a quick look at the configuration options available through the ClientConfiguration class

如果您需要对客户端的行为方式进行更多控制,例如它们是应该使用通用的 HTTP 连接池还是单独的连接池,那么您可以使用此处描述的方法 https://docs.aws.amazon.com/sdk-for-java/v1/developer-guide/creating-clients.html

所以,为了回答这个问题,什么会更快,为每个请求创建单独的客户端会浪费连接池等资源,因此不会更快。为了使事情更快地工作,应该查看此处详述的客户端调整选项 https://aws.amazon.com/blogs/developer/tuning-the-aws-sdk-for-java-to-improve-resiliency/