1

在可能的应用程序中,我有以下过程:

  1. 得到一个很长的人名单
  2. 为每个人创建一个实体
  3. 向每个人发送电子邮件(步骤 2 必须在步骤 3 开始之前完成)

因为人的名单很大,我不想把他们放在同一个实体组里。

在执行第 3 步时,我可以像这样查询人员列表:

Person.all()

由于最终的一致性,我可能会在第 3 步中错过一些人。什么是确保我在第 3 步中不会错过任何人的好方法?

有没有比这更好的解决方案?:

while Person.all().count() < N:
    pass
for p in Person.all()
    # do whatever

编辑:

另一个可能的解决方案浮现在脑海中。我可以创建一个人的链接列表。我可以存储一个链接到第一个,他可以链接到第二个等等。但是,性能似乎很差,因为您将分别进行每个 get 并且不会具有查询的效率。

4

1 回答 1

0

更新:我重读了您的帖子,发现您不想将它们全部放在同一个实体组中。如果不这样做,我不确定如何保证强一致性。您可能希望重组数据,以便不必将它们放在同一个实体组中,而是放在多个实体组中。也许取决于一组 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) 

您甚至可以在此时对具有相同父级的所有实体进行查询,这很好。但这应该可以帮助您获得更一致的结果。

于 2013-01-28T06:02:29.390 回答