繁体   English   中英

Amazon S3 是否有连接池?

[英]Does Amazon S3 have a connection pool?

我曾经使用过代码

public static AmazonS3Client s3 = null;
...
BasicAWSCredentials c = new BasicAWSCredentials("absadgwslkjlsdjgflwa");
s3 =  new AmazonS3Client(c);

仅创建一个实例s3,而数十个线程将通过s3.putObject() 上传图片。 在转储信息中,我可以看到一个线程会在其他线程等待时锁定唯一的实例 s3。

所以我想如果我使用下面的代码可能会更快:

BasicAWSCredentials c = new BasicAWSCredentials("absadgwslkjlsdjgflwa");
for(int i = 0; i < 10; i++)
    amazonS3[i] = new AmazonS3Client(c);

每次系统都会得到一个随机的s3实例,然后上传图片。

private static AmazonS3 getS3(){
    int i = (int)(Math.random() * 10); 
    return amazonS3[i];
}

但似乎系统变慢了。 为什么会这样? 也许唯一的实例 s3 已经使用了连接池? 我很迷惑。

AWS SDK for Java中的每个客户端(包括Amazon S3客户端)当前都维护着自己的HTTP连接池。 您可以通过可以传递到客户端对象构造函数的ClientConfiguration类来调整HTTP连接池的最大大小。

我们建议共享客户端对象,因为有太多的HTTP连接池没有得到有效利用的费用和开销。 当你在这样的线程之间共享客户端对象时,你会看到更好的性能。

复制并运行示例

ClientConfiguration clientConfiguration = new ClientConfiguration().withMaxErrorRetry(10).withMaxConnections(350);
AmazonS3 s3 = AmazonS3ClientBuilder.standard().withRegion(Regions.EU_WEST_1).withClientConfiguration(clientConfiguration).build();

这是 AWS SDK V2 的解决方案:

  1. 添加以下依赖项:
implementation 'software.amazon.awssdk:s3'
implementation 'software.amazon.awssdk:apache-client'
  1. S3Client 默认使用 ApacheHttpClient。 所以重写以下配置:
var config = ApacheHttpClient.builder().maxConnections(100);
return S3Client.builder().httpClientBuilder(config).build();

AWS 文档中描述了更多详细信息

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM