【问题标题】:Does Amazon S3 have a connection pool?Amazon S3 有连接池吗?
【发布时间】:2017-11-22 06:43:58
【问题描述】:

我曾经使用过代码

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 已经使用了连接池?我很困惑。

【问题讨论】:

    标签: java amazon-web-services amazon-s3


    【解决方案1】:

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

    我们建议共享客户端对象,因为有太多未得到有效利用的 HTTP 连接池会产生费用和开销。当您像这样跨线程共享客户端对象时,您应该会看到更好的性能。

    【讨论】:

    • 对于我们当中的文盲...你是说 Mark_H 不应该创建一个 S3 客户端数组吗?您是否建议他应该使用单个 S3 客户端并将其传递给不同的线程?
    • 你这里指的是setMaxConnections方法吧?
    • @mmcrae - 这是正确的。跨线程重用客户端对象以更有效地使用资源(即共享一个连接池)
    • @rogerdpack - 是的,max connections property 控制每个客户端的连接池大小。
    • 有点不相关,在 hadoop 世界中,如果您在 hadoop 2.7+ 中使用 s3a(可能是 2.6,尽管我不能确定)
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2011-04-15
    • 2017-09-29
    • 1970-01-01
    • 2017-01-26
    • 2015-10-13
    • 2016-09-14
    • 2017-06-16
    相关资源
    最近更新 更多