我想在测试用例期间上传文件,然后立即下载以验证文件是否已上传。我使用的键已经上升到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);
但我得到的对象不是我刚刚上传的对象。
我是否需要做一些事情,或者是否有人知道这种方法的缺点是什么?
答案 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贵一点。