S3常见问题解答提到"所有Regions中的AmazonS3 bucket为新对象的PUTS提供了读写一致性,并为覆盖PUTS和DELETES提供了最终的一致性。"然而,我不知道需要多长时间才能获得最终的一致。我试着搜索这个,但在S3文档中找不到答案。
情况:
我们有一个由7个步骤组成的网站。当用户在每个步骤中点击保存时,我们希望将一个json文档(包含所有7个步骤的信息)保存到AmazonS3。目前我们计划:
- 创建一个S3存储桶来存储所有json文档
- 当用户保存步骤1时,我们在S3中创建一个新项目
- 当用户保存步骤2-7时,我们覆盖现有项目
- 用户保存步骤并刷新页面后,应该能够看到刚刚保存的信息。我们想确保我们总是一次又一次地阅读
完整的json文档(所有7个步骤都已完成)大约为20 KB。用户点击保存按钮后,我们可以冻结页面一段时间,在保存完成之前,他们无法进行其他更改。
问题:
- AWS S3保存和加载项目需要多长时间?(当文档保存到S3时,我们可以冻结我们的网站)
- 是否有根据项目大小计算保存/加载时间的功能
- 如果我选择另一个S3区域,保存/加载时间会有所不同吗?如果是的话,西雅图的最佳地区是哪个
我想添加到@error2007s的答案中。
AWS S3保存和加载项目需要多长时间?(当文档保存到S3时,我们可以冻结我们的网站)
这不仅是因为你在任何地方都找不到的确切时间——实际上没有这样的确切时间。这就是"最终一致性"的意义所在:一致性最终会实现。你不知道什么时候。
如果有人给了你一个系统实现一致性所需时间的上限,那么你就不会再称之为"最终一致"了。它将"在X时间内保持一致"。
现在的问题变成了,"我如何处理最终的一致性?">(而不是试图"击败它")
要真正找到这个问题的答案,您需要首先了解您真正需要什么样的一致性,以及S3的最终一致性会如何影响您的工作流程。
根据你的描述,我知道你总共会给S3写7次,每走一步就写一次。在第一篇文章中,当您正确地引用了常见问题解答时,您可以在之后的任何阅读中获得很强的一致性。对于所有后续的写入(实际上是"替换"原始对象),您可能会观察到最终的一致性——也就是说,如果您尝试读取覆盖的对象,您可能得到最新的版本,也可能得到旧的版本。在这个场景中,这就是S3上所谓的"最终一致性"。
几个备选方案供您考虑:
-
不要在每一步都写入S3;相反,在客户端保留每一步的数据,然后在第7步之后只向S3写入一个对象。这样,只有1个写入,没有"重写",因此没有"最终一致性"。对于您的特定场景,这可能是可能的,也可能是不可能的,您需要对此进行评估。
-
或者,为每个步骤写入具有不同名称的S3对象。例如,类似于:在步骤1之后,将其保存到
bruno-preferences-step-1.json
;然后,在步骤2之后,将结果保存到bruno-preferences-step-2.json
;等等,然后将最终的首选项文件保存到bruno-preferences.json
,甚至bruno-preferences-step-7.json
,这样您就可以灵活地在将来添加更多步骤。请注意,这里的想法是为了避免覆盖,这可能会导致最终的一致性问题。使用这种方法,您只需编写新对象,而不会覆盖它们。 -
最后,您可能需要考虑AmazonDynamoDB。它是一个NoSQL数据库,您可以直接从浏览器或服务器安全地连接到它。它为您提供了复制、自动扩展和负载分配(就像S3一样)。您还可以选择告诉DynamoDB,您希望执行强一致性读取(默认为最终一致性读取;您必须更改参数才能获得强一致性读)。DynamoDB通常用于"小型"记录,20kB肯定在这个范围内——截至目前,记录的最大大小将为400kB。您可能想看看:DynamoDB常见问题解答:亚马逊DynamoDB的一致性模型是什么
AWS S3保存和加载项目需要多长时间?(当文档保存到S3时,我们可以冻结我们的网站)
您在任何地方都找不到确切的时间。如果你问AWS,他们会给你大约的时间。你的文件是20 KB,所以根据我从S3使用的经验,时间将或多或少是60-90秒。
是否有根据项目大小计算保存/加载时间的函数?
没有任何函数可以用来计算。
如果我选择另一个S3区域,保存/加载时间会有所不同吗?如果是的话,西雅图的最佳地区是哪个?
对于西雅图美国西俄勒冈州将毫无问题地工作。
你也可以看看这个实验进行比较https://github.com/andrewgaul/are-we-consistent-yet