上传后的Amazon S3文件可用性

时间:2015-06-04 18:01:51

标签: java amazon-s3

我想在测试用例期间上传文件,然后立即下载以验证文件是否已上传。我使用的键已经上升到S3。

当我的上传完成后,我会进行下载,但不知怎的,我得到了此文件的先前版本。

我的代码看起来像这样:

final ObjectMetadata objectMetadata = new ObjectMetadata(); objectMetadata.setContentType(binaryDataReference.getContentType()); objectMetadata.setContentLength(data.length); objectMetadata.setContentEncoding(xmlEncoding.getCharset()); s3Client.putObject(BUCKET_NAME, key, new ByteArrayInputStream(data), objectMetadata); Thread.sleep(30000); // this I've done because I thought its a timing issue. S3Object object = s3Client.getObject(BUCKET_NAME, binaryDataKey);

但我得到的对象不是我刚刚上传的对象。

我是否需要做一些事情,或者是否有人知道这种方法的缺点是什么?

1 个答案:

答案 0 :(得分:3)

这就是S3 works

的方式
  

美国标准区域中的Amazon S3存储桶提供eventual consistency。所有其他地区提供的Amazon S3存储桶   新对象和最终的PUTS的读写后一致性   覆盖PUTS和DELETES的一致性。

这意味着在写完新对象后,只要它不在美国标准区域,您就可以立即读取它。否则 - 即如果您在美国标准区域或者您正在覆盖或删除现有对象 - 您只能保证"最终"您的行动结果将会显示。

我曾经问过亚马逊是否在覆盖了成功读回最新版本的对象后,是否保证同一连接上的所有后续读取都返回最新版本。也就是说,如果我编写版本2并阅读版本2,我是否再也不会阅读版本1?他们没有回应。

如果确实需要更强的一致性Google Cloud Storage provides read-after-update and read-after-delete consistency,尽管上次检查时GCS比S3贵一点。