我们有一个服务器应用程序,可以在DynamoDB中进行大量读写操作。
今天我们为每个注入点(CDI依赖范围)注入一个新的DynamoDB
和新的AmazonDynamoDBClient
。大多数情况下,我们的应用中的新请求会注入DynamoDB
个实例。
我知道DynamoDB
是线程安全的,我可以将其范围更改为@ApplicationScoped
,但对DynamoDB端点的请求将是串行的,从而导致我的应用程序性能下降?或者甚至只有DynamoDB
的单个实例,它可以处理对AWS DynamoDB端点的同时请求?
由于
答案 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/
所述