在Google App Engine上编写实体组的组织方式

6
我对Google App Engine High Replication Datastore(HRD)上的“实体组”有点困惑。 Google文档提到,HRD每个实体组只允许1次写入每秒。
这到底是什么意思?这是每个用户请求一个写入,还是每个实体(我认为类似于“表”)一个写入?
例如,如果我有一个“用户”实体和一个“帖子”表。如果“帖子”是“用户”的祖先:
1.这是否意味着一个“用户”每秒只能创建一个“帖子”? 2.还是意味着“帖子”实体的所有写入都限制在每秒1次,无论用户数量如何?(即使有成千上万的用户提交帖子,系统也只能一次保存1个帖子) 3.还是意味着单个“用户”实体不能同时创建多个“帖子”(即使有成千上万的其他用户创建了“帖子”实体)?
我该怎么办才能缓解这种情况?将“用户”和“帖子”作为根实体是合理的吗?这样做是否允许我在每秒1次的限制之外创建多个“帖子”实例?如果1000个用户同时创建“帖子”条目,我想避免任何潜在问题。
2个回答

8
“实体组”不像“表格”。在AppEngine数据存储中没有任何意味着“表格”的东西。您应该只考虑实体和索引。
只有当您想进行操作事务时才使用实体组。在具有“帖子”的博客的情况下,可能添加或删除帖子并不重要,因此它们不需要在实体组中。
我的应用程序中有大约15种不同类型的实体,大约有150万个。每个都是根实体,即使是相关的实体,我认为这对于AppEngine来说是理想的。据我所知,实体组的唯一目的是支持对多个实体的原子操作-它们不是组织工具。
PS:关于您对实体组限制的问题(我认为现在大部分都无关紧要):写入限制是针对每个实体而不是每个请求的。 1.实体不会创建其他实体。 2.如果所有帖子都在同一个实体组中,则确实只能保存每秒钟1个。 3.如果每个用户都在自己的实体组中,则可以同时在同一组中写入1个帖子,每秒钟多次,您喜欢多少次。只是不能超过每秒钟写入单个组。是的,我认为“用户”和“帖子”都应该是根实体。

太棒了!非常感谢您的澄清。顺便问一下(考虑到您的经验):与使用外部数据存储(如MongoDB或AWS DynamoDB)相比,您认为HRD有何优势? - Jamie Chapman
2
不用谢!我没有与外部数据存储的经验。很难想象任何外部存储的延迟不会超过它们可能具有的其他性能优势。尽管如此,我可以想象它们的功能优势... - Riley Lark
2
只是澄清一下,限制是针对实体组的不同写入次数 - 但您可以通过一次调用在组内写入多个实体。请参阅此Google IO talk - Daniel Roseman
你认为将用户和帖子放入同一高级实体中是否有任何好处或成本? - Adam S.

1

使用实体组还有助于使组内的数据高度一致。

例如,如果没有实体组,您创建了一个帖子,然后快速导航到最近的帖子列表,您可能无法立即看到您的新帖子。对于博客来说,这可能不是问题。

但是,如果您正在进行任务管理系统...您进入任务详细信息屏幕,关闭任务并返回任务列表,该任务仍可能显示为打开状态。这是不可接受的。在这种情况下,您需要实体组或其他方法来使当前用户的任务列表保持一致。

在某些数据模型中,创建实体组很容易。例如,将任务作为项目组的一部分解决了问题,假设您只能显示单个组的任务。如果您的UI允许列出来自多个组的任务,则更难找到适合的模型。


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接