【问题标题】:Multiple microservice trying to create amazonaws bucket多个微服务试图创建亚马逊存储桶
【发布时间】:2023-07-02 00:28:01
【问题描述】:

我正在尝试使用 AmazonS3Client 类 (com.amazonaws) 的 createBucket(String bucketName) 方法创建 S3 存储桶,但在此处提供的文档中 https://docs.aws.amazon.com/AWSJavaSDK/latest/javadoc/ 它没有提到如果我的 2 个微服务尝试创建会出现什么情况同一个桶。如果一个人正在创建存储桶并且其他调用同时获得,它会抛出错误吗? 这种情况下的异常抛出也不清楚。

public Bucket createBucket(CreateBucketRequest createBucketRequest)
                throws SdkClientException,
                       AmazonServiceException

我正在使用以下版本的 s3 sdk

<dependency>
        <groupId>com.amazonaws</groupId>
        <artifactId>aws-java-sdk-s3</artifactId>
        <version>1.11.184</version>
    </dependency>

【问题讨论】:

  • 为什么不在代码中尝试一下呢?创建存储桶两次,看看会发生什么。
  • @stdunbar 两次创建bucket并不完全一样,我说的是一个线程正在创建bucket,如果另一个线程也尝试从另一个微服务实例中创建的场景。然后会发生什么。如果它只是一个线程,那么我只需通过 dosBucketExist() 方法进行检查。
  • 就像我们在单例模式中使用双锁检查时一样。

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


【解决方案1】:

根据these API docs,方法签名看起来不同:

default CreateBucketResponse createBucket(CreateBucketRequest createBucketRequest)
                                   throws BucketAlreadyExistsException,
                                          BucketAlreadyOwnedByYouException,
                                          AwsServiceException,
                                          SdkClientException,
                                          S3Exception

你应该看到BucketAlreadyExistsException

您使用的是旧版 SDK (v1) 吗?

通常,AWS API 通过拒绝第二个 API 调用并返回由 409 冲突 HTTP 状态代码表示的错误并称为“BucketAlreadyExists”来处理这些冲突。你可以了解更多关于here的信息。

【讨论】:

  • 我认为两者是不同的,我在我的 pom 中使用的是不同的,我已经用 sdk 的版本更新了问题。另外我使用的文件是 com.amazonaws.services.s3.AmazonS3Client ,它的 createBucket 方法不会抛出 BucketAlreadyExistsException 异常