我想添加到@error2007s 的答案。
AWS S3 保存和加载项目需要多长时间?(我们可以在将文档保存到 S3 时冻结我们的网站)
这不仅是您在任何地方都找不到确切的时间- 实际上没有确切的时间。这就是“最终一致性”的全部含义:最终将实现一致性。你不知道什么时候。
如果有人给你一个系统达到一致性需要多长时间的上限,那么你就不会再称它为“最终一致”了。这将是“在 X 时间内保持一致”。
现在的问题变成了“我如何处理最终的一致性?” (而不是试图“打败它”)
要真正找到该问题的答案,您需要首先了解您真正需要什么样的一致性,以及S3的最终一致性究竟会如何影响您的工作流程。
根据您的描述,我知道您将总共向 S3 写入 7 次,每一步执行一次。对于第一次写入,正如您正确引用了常见问题解答一样,之后的任何读取都将获得高度一致性。对于所有后续写入(实际上是“替换”原始对象),您可能会观察到最终的一致性 - 也就是说,如果您尝试读取覆盖的对象,您可能会获得最新版本,或者您可能会获得旧版本. 在这种情况下,这就是 S3 上的“最终一致性”。
您可以考虑一些替代方案:
不要在每一步都写入 S3;相反,将每个步骤的数据保留在客户端,然后在第 7 步之后仅将 1 个单个对象写入 S3。这样,只有 1 次写入,没有“覆盖”,因此没有“最终一致性”。对于您的特定场景,这可能会也可能不会,您需要对此进行评估。
或者,为每个步骤写入具有不同名称的 S3 对象。例如,类似:在第 1 步之后,将其保存到bruno-preferences-step-1.json
;然后,在第 2 步之后,将结果保存到bruno-preferences-step-2.json
; 依此类推,然后将最终的首选项文件保存到bruno-preferences.json
,或者甚至bruno-preferences-step-7.json
,让您自己可以灵活地在将来添加更多步骤。请注意,这里的想法是避免覆盖,这可能会导致最终的一致性问题。使用这种方法,你只写新对象,你永远不会覆盖它们。
最后,您可能需要考虑Amazon DynamoDB。它是一个 NoSQL 数据库,您可以直接从浏览器或服务器安全地连接到它。它为您提供复制、自动扩展、负载分配(就像 S3 一样)。您还可以选择告诉 DynamoDB 您想要执行强一致性读取(默认为最终一致性读取;您必须更改参数才能获得强一致性读取)。DynamoDB 通常用于“小”记录,20kB 肯定在范围内——截至今天,记录的最大大小为 400kB。您可能想查看以下内容:DynamoDB 常见问题:Amazon DynamoDB 的一致性模型是什么?