【发布时间】:2018-05-15 15:54:37
【问题描述】:
我有两个使用 S3 来传递信息的客户端程序。该信息是文件列表。
我们称客户端为“上传者”和“下载者”:
上传者做了这样的事情:
- 上传文件A
- 上传文件B
- 上传文件C
- 上传 SUCCESS 标记文件
下载器做了一些谎言:
- 检查成功标记
- 如果找到,请下载 A、B、C。
- 否则,从其他地方获取数据
这两个程序都在定期运行。上传完成后将填充一个新目录,下载程序将尝试获取可用的最新版本的 A、B、C。
希望意图很明确 — 我不希望下载者看到部分视图,而是获取所有 A、B、C 或跳过该目录。
但是,我认为这行不通。由于最终的一致性,上传者的 PUT 可以重新排序为:
- 上传文件B
- 上传 SUCCESS 标记文件
- 上传文件A
- ...
此时,下载器可能会运行,看到 SUCCESS 标记,并假设目录已填充(实际上并非如此)。
那么正确的方法是什么?
一个想法是上传者先上传A,B,C,然后反复检查文件是否存储,只有在看到所有文件后,最后写入SUCCESS标记。
这行得通吗?
【问题讨论】:
-
在 A、B 和 C 上传成功后,能否使用 SQS 从上传程序向下载程序发送 SUCCESS 标记消息(而不是 S3 标记文件)?
-
@AdilB:理想情况下,我希望避免添加更多依赖项。但即使我照你说的做,它有什么帮助?不能保证在收到 SQS 消息后,我现在能够在 S3 中找到所有 A、B、C,是吗?据我了解,这就是“最终一致性”中的全部“最终”。
-
实际上,再次查看 S3 文档:
Amazon S3 provides read-after-write consistency for PUTS of new objects in your S3 bucket in all regions with one caveat.需要注意的是:只要您不打算在上传文件 A、B 或 C 后覆盖它们,它们应该立即保持一致连同您的 SUCCESS 文件标记到下载程序。 -
@AdilB 几乎是真的。如果您在对象存在之前检查它的存在,那么您在创建该对象时会立即失去一致性......因此成功文件的出现可能会延迟,但只要您不检查任何其他对象,首先,你很好。
-
是的,我也阅读过这些文档。问题是我的上传器和下载器进程彼此独立运行。我没有办法确保我只在写入标记文件后才读取它,所以我没有办法获得写入后读取的一致性。一旦我进入最终的一致性领域,标记是否不能首先出现,即使它是最后上传的?我不清楚是否有任何关于(最终一致的)标记和 A、B、C 文件外观之间的关系的保证。
标签: amazon-s3 eventual-consistency