我想在测试用例中上传文件,然后立即下载以确认文件已上传。我使用了已经升级到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);
但是我得到的对象不是我刚刚上传的对象。
我需要做点什么还是有人知道这种方法有什么用?
最佳答案
这就是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略高。