AWS S3 保存和加载项目需要多长时间?

How long does it take for AWS S3 to save and load an item?

S3 FAQ 提到 "Amazon S3 buckets in all Regions provide read-after-write consistency for PUTS of new objects and eventual consistency for overwrite PUTS and DELETES." 但是,我不知道最终一致性需要多长时间。我试图搜索这个但在 S3 文档中找不到答案。

情况:

我们的网站包含 7 个步骤。当用户在每个步骤中单击保存时,我们希望将 json 文档(包含所有 7 个步骤的信息)保存到 Amazon S3。目前我们计划:

  1. 创建一个 S3 存储桶来存储所有 json 个文档。
  2. 当用户保存第 1 步时,我们在 S3 中创建一个新项目。
  3. 当用户保存第 2-7 步时,我们将覆盖现有项目。
  4. 用户保存一个步骤并刷新页面后,他应该能够看到他刚刚保存的信息。即我们要确保我们总是先写后读。

完整的 json 文档(完成所有 7 个步骤)大约为 20 KB。 用户单击保存按钮后,我们可以冻结页面一段时间,并且在保存完成之前他们不能进行其他更改。

问题:

  1. AWS S3 保存和加载项目需要多长时间? (我们可以在文件保存到 S3 时冻结我们的网站)
  2. 是否有根据项目大小计算 save/load 时间的函数?
  3. 如果我选择另一个 S3 区域,save/load 时间会有所不同吗?如果是的话,哪个是西雅图最好的地区?

How long does it take for AWS S3 to save and load an item? (We can freeze our website when document is being saved to S3)

你不会在任何地方找到准确的时间。如果你问 AWS,他们会给你大概的时间。您的文件大小为 20 KB,因此根据我使用 S3 的经验,时间大约为 60-90 秒。

Is there a function to calculate save/load time based on item size?

不,没有任何函数可以用来计算这个。

Is the save/load time gonna be different if I choose another S3 region? If so which is the best region for Seattle?

美国西俄勒冈州西雅图 可以正常使用。

你也可以看看这个实验对比一下https://github.com/andrewgaul/are-we-consistent-yet

我想添加到@error2007s 答案中。

How long does it take for AWS S3 to save and load an item? (We can freeze our website when document is being saved to S3)

不仅您在任何地方都找不到确切时间 - 实际上没有这样的确切时间。这就是 "eventual consistency" 的全部意义所在:最终 将实现一致性。你不知道什么时候。

如果有人给了您系统实现一致性所需时间的上限,那么您就不会再称它为 "eventually consistent"。它将是 "consistent within X amount of time".


问题现在变成了,"How do I deal with eventual consistency?"(而不是尝试"beat it")

要真正找到该问题的答案,您首先需要了解您真正需要什么样的一致性,以及 S3 的最终一致性 究竟会如何影响您的工作流程。

根据您的描述,我了解到您总共会向 S3 写入 7 次,每一步一次。对于第一次写入,因为您正确引用了常见问题解答,所以之后的任何读取都具有很强的一致性。对于所有后续写入(实际上是 "replacing" 原始对象),您可能会观察到最终一致性 - 也就是说,如果您尝试读取被覆盖的对象,您可能会获得最新版本,或者您可能会得到一个旧版本。在这种情况下,这就是 S3 上的 "eventual consistency"。

您可以考虑的几个备选方案:

  • 不要每一步都写入 S3;相反,将每个步骤的数据保存在客户端,然后在第 7 步之后只将 1 个对象写入 S3。这样,只有 1 次写入,没有 "overwrites",所以没有 "eventual consistency"。对于您的特定场景,这可能可行也可能不可行,您需要对其进行评估。

  • 或者,为每个步骤写入不同名称的 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 通常用于 "small" 条记录,20kB 肯定在这个范围内——截至今天,一条记录的最大大小为 400kB。你可能想看看这个:DynamoDB FAQs: What is the consistency model of Amazon DynamoDB?