更新:我重读了您的帖子,发现您不想将它们全部放在同一个实体组中。如果不这样做,我不确定如何保证强一致性。您可能希望重组数据,以便不必将它们放在同一个实体组中,而是放在多个实体组中。也许取决于一组 Person 实体的某些方面?(例如,他们所在的邮件列表、发送的电子邮件类型等)每个人是否仅包含姓名和电子邮件地址,或者是否涉及其他属性?
谷歌提出了一些其他的选择:
如果您的应用程序可能会遇到更重的写入使用,您可能需要考虑使用其他方式:例如,您可能会将最近的帖子放入具有过期时间的内存缓存中,并显示来自内存缓存和数据存储的最近帖子的混合,或者您可能会将它们缓存在 cookie中,在 URL 中放置一些状态,或者完全是其他东西。目标是找到一个缓存解决方案,在用户发布到您的应用程序的时间段内为当前用户提供数据。请记住,如果您在事务中执行 get、put 或任何操作,您将始终看到最近写入的数据。
因此,看起来您可能想要调查这些可能性,尽管我不确定它们将如何转化为您的应用程序所需的内容。
ORIGINAL POST:使用祖先查询。
来自 Google 的“Structuring Data for Strong Consistency”:
要获得高度一致的查询结果,您需要使用祖先查询将结果限制为单个实体组。这是有效的,因为实体组是一致性和事务性的单位。所有数据操作都应用于整个组;在整个实体组更新之前,祖先查询不会返回其结果。如果您的应用程序依赖于某些查询的高度一致的结果,您可能需要在设计数据模型时考虑到这一点。本页讨论了构建数据以支持强一致性的最佳实践。
因此,当您创建 Person 实体时,请为其设置父级。我相信你甚至可以让一个特定的实体成为所有其他实体的“父母”,它应该给你很强的一致性。(尽管无论如何我都喜欢用祖先来构建我的数据。)
# Gives you the ancestor key
def ancestor_key(kind, id_or_name):
return db.Key.from_path(kind, id_or_name)
# Kind is the db model your using (should be 'Person' in this case) and
# id_or_name should be the key id or name for the parent
new_person = Person(your_params, parent=ancestor_key('Kind', id_or_name)
您甚至可以在此时对具有相同父级的所有实体进行查询,这很好。但这应该可以帮助您获得更一致的结果。