【问题标题】:Uploading files to S3 in Multithreading在多线程中将文件上传到 S3
【发布时间】:2021-11-09 11:26:39
【问题描述】:

我在 spring 应用程序中使用 s3 AWS 客户端将文件上传到 s3,但有时我会收到错误,

com.amazonaws.SdkClientException: Unable to execute HTTP request: Timeout waiting for connection from pool
com.amazonaws.SdkClientException: Unable to execute HTTP request: Timeout waiting for connection from pool
Caused by: org.apache.http.conn.ConnectionPoolTimeoutException: Timeout waiting for connection from pool

因此,作为解决方案,我使用了以下方法,它现在有效。

@Bean
public AmazonS3 s3Client() {
    return AmazonS3ClientBuilder
            .standard()
            .withClientConfiguration(new ClientConfiguration()
                    .withMaxConnections(100)
                    .withConnectionTimeout(100)
                    .withMaxErrorRetry(5))
            .build();
}

public String uploadFile() {
    // upload code
}

我已将其创建为 Spring Bean。但我在多线程环境中使用它。所以会同时有很多并发请求。我看到AmazonS3ClientBuilder@NotThreadSafe 注释。所以我需要知道在多线程中使用它作为bean是否可以,否则我应该在同一个uploadFile方法中使用上面的代码块吗?谁能解释我最好的方法?谢谢

【问题讨论】:

    标签: java spring-boot amazon-s3 aws-java-sdk


    【解决方案1】:

    您尚未分享上传过程的实际代码,但我认为您的问题在于那个。所以,回答你的问题:

    1. 关于@NotThreadSafe,您不必担心这一点。您使用构建器的目的是创建AmazonS3 客户端的实例。此过程在 Spring 初始化期间完成,这反过来意味着整个过程由 single thread 处理,因此不受潜在同步问题的影响。请注意,前面提到的是关于AmazonS3ClientBuilder。如您在相关的source 中所见,创建的AmazonS3Client 对象(通过调用AmazonS3ClientBuilder#build 创建)被标记为线程安全的。

    2. 关于您遇到的问题。不幸的是,如果不共享上传对象逻辑,就没有具体的方法来理解它的确切原因。但是,我认为您的问题源于您创建的并发上传请求数量高于配置的最大连接数的事实。这反过来又会导致这些请求被阻塞,等待从 http 池中检索连接。如果无法及时检索到,则请求将超时(您所遇到的情况)。有关更多信息,您可以查看相关问题 here,它概述了您得到的相同行为,尽管是下载操作。

    【讨论】:

    • 知道了。谢谢你的回答。
    猜你喜欢
    • 2018-10-09
    • 1970-01-01
    • 1970-01-01
    • 2017-12-20
    • 1970-01-01
    • 2018-10-28
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多