簡體   English   中英

如何以線程安全的方式實施 AWS S3 客戶端?

[英]How I can implement AWS S3 client in a thread safe manner?

您好我有一個由多個線程同時執行以連接到 s3 存儲桶對象並讀取元數據的方法。 所有這些方法都使用單個 s3 客戶端 object。 根據 Amazon Java SDK 文檔,我發現 s3Clients 是線程安全對象。 以下實現方式會導致任何死鎖或性能問題嗎? 在 s3 客戶端使用多線程時,這是正確的實現方式嗎?

public class S3Client {
    // static method that returns the s3 client for all the requests
    public static AmazonS3 getS3Client(){
        return AmazonS3ClientBuilder.standard().withRegion(Regions.DEFAULT_REGION).build();
    }
}

還有另一個類(RequestHandler->readObject 方法)將由多個線程同時執行。 因此將為每個請求執行。

public class RequestHandler {
    // Multiple concurrent threads are accessing this method
    public void readObject(){
        AmazonS3 s3Client = S3Client.getS3Client();
        ListObjectsV2Result result = s3Client.listObjectsV2("bucket_name");
    }
}

請指教。 提前致謝!!

讓go一一:

  1. java AWS S3 sdk 中的構建器通常不是線程安全的。 所以盡量不要在多線程環境中使用S3Client#getS3Client()
  2. AmazonS3Client使用@ThreadSafe注釋。 這是 Java AWS sdk 中的注釋,將 class 標記為線程安全的。 所以沒有必要像你一樣創建某種 object 工廠,每個應用程序只能有一個AmazonS3Client singleton object。 在上面的示例中,您清楚地為每個RequestHandler#readObject()方法調用創建了新實例。 這不僅不安全,而且可能會導致性能問題,因為您將創建大量AmazonS3Client ,這將降低您的 java 應用程序垃圾收集過程。

You can solve pretty much all of it if you will just use a singleton pattern, ie create AmazonS3Client as a singleton object, either by spring, or by any other IoC framework, or by yourself, for example via double check locking . 通過這種方式,您將實現線程安全以及相對良好的性能(與問題中的代碼相比)。

希望對您有所幫助,祝您有美好的一天!)

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM