S3空桶PUT子键文件后LIST操作的读写一致性问询
S3 LIST 操作的写后读一致性问题解答
先给你明确的结论:完全可以保证在 LIST 结果里看到 y.dat 和 z.dat,这个场景下 LIST 表现出写后读一致性。
具体原因拆解如下:
S3 一致性的核心逻辑
在同一个 AWS 区域内,S3 对新对象的PUT操作提供写后读一致性——也就是说,只要PUT成功返回,后续针对该对象(或者包含它的前缀)的GET、LIST操作都能立刻看到这个对象。
这里要澄清一个点:S3 没有真正的“目录”,s3://BUCKET/x/只是一个虚拟前缀,只有当你主动 PUT 一个空对象来模拟目录时,它才会有对应的元数据。而你既没创建过这个空对象,也从未对x这个前缀做过任何元数据查询(比如HEAD s3://BUCKET/x/),所以不存在旧状态缓存的问题。你的场景刚好触发写后读一致性
你执行的两次PUT都是创建全新的子对象,成功返回后,S3 已经把这两个对象的索引信息同步到了存储集群。
之后的LIST s3://BUCKET/x/请求,本质是拉取所有前缀为x/的对象列表。因为之前没有查询过这个前缀的元数据,S3 不会用缓存的旧状态,而是直接读取最新的索引,所以肯定能看到这两个刚上传的文件。排除例外情况
只有一种情况可能看不到:如果你之前对s3://BUCKET/x/做过元数据查询(比如 HEAD 请求),那 S3 可能会缓存这个前缀的旧状态,后续 PUT 子对象后 LIST 可能有延迟(最终一致性)。但题目里明确说你从未做过这类操作,所以这个例外不成立。
内容的提问来源于stack exchange,提问作者teabot
相关产品推荐
相关产品推荐

