S3 FAQ提到“所有区域中的Amazon S3存储桶都为新对象的PUTS提供了读写后一致性,并为覆盖PUTS和DELETES提供了最终的一致性。”但是,我不知道获得最终一致性需要多长时间。我试图搜索这个,但在S3文档中找不到答案。
情况:
我们有一个由7个步骤组成的网站。当用户在每个步骤中单击“保存”时,我们希望将json文档(包含所有7个步骤的信息)保存到Amazon S3。目前我们计划:
完整的json文档(完成所有7个步骤)大约为20 KB。 用户点击“保存”按钮后,我们可以冻结页面一段时间,在保存完成之前无法进行其他更改。
问题:
答案 0 :(得分:8)
我想添加@ error2007s答案。
AWS S3保存和加载项目需要多长时间? (当文档保存到S3时,我们可以冻结我们的网站)
不仅你不会在任何地方找到确切的时间 - 实际上没有确切的时间。这就是"最终的一致性"关键是:将实现一致性最终。你什么时候都不知道。
如果有人给你一个系统为达到一致性需要多长时间的上限,那么你就不会把它称为“#34;最终是一致的"了。它将在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通常用于" small"记录,20kB绝对在范围内 - 截至今天,记录的最大尺寸为400kB。您可能需要查看此内容:DynamoDB FAQs: What is the consistency model of Amazon DynamoDB?
答案 1 :(得分:1)
AWS S3保存和加载项目需要多长时间? (当文档保存到S3时,我们可以冻结我们的网站)
您无法在任何地方找到确切的时间。如果您询问AWS,他们会给您大约时间。您的文件是20 KB,因此根据我使用S3的经验,时间将或多或少为60-90秒。
是否有根据项目大小计算保存/加载时间的功能?
没有任何功能可以用来计算它。
如果我选择另一个S3区域,保存/加载时间会不同吗?如果是这样哪个是西雅图的最佳地区?
对于西雅图美国西部俄勒冈州将毫无问题地工作。
您还可以查看此实验以进行比较https://github.com/andrewgaul/are-we-consistent-yet