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

时间:2017-06-15 01:25:40

标签: java amazon-web-services amazon-dynamodb inversion-of-control cdi

我们有一个服务器应用程序,可以在DynamoDB中进行大量读写操作。

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

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

由于

1 个答案:

答案 0 :(得分:0)

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

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

其中一个SDK客户端(例如:AmazonS3Client)的每个实例都会创建自己的客户端对象来发送HTTP请求,由于它可以管理HTTP连接池之类的资源,因此这可能相对昂贵。

通过重用相同的S3客户端对象,您将更有效地利用资源。

当您通过客户端增加更多负载时,您可能还会快速查看通过ClientConfiguration类可用的配置选项

如果您需要对客户端的行为进行更多控制,例如它们应使用公用的http连接池还是使用单独的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/

所述