【问题标题】:GAE/P: Dealing with eventual consistencyGAE/P:处理最终一致性
【发布时间】:2013-01-28 03:54:20
【问题描述】:

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

  1. 获取很长的人员列表
  2. 为每个人创建一个实体
  3. 向每个人发送一封电子邮件(步骤 2 必须在步骤 3 开始之前完成)

由于人员列表很大,我不想将他们放在同一个实体组中。

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

Person.all()

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

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

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

编辑:

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

【问题讨论】:

    标签: python google-app-engine google-cloud-datastore


    【解决方案1】:

    更新:我重读了您的帖子,发现您不想将它们全部放在同一个实体组中。如果不这样做,我不确定如何保证强一致性。您可能希望重组数据,以便不必将它们放在同一个实体组中,而是放在多个实体组中。也许取决于一组 Person 实体的某些方面? (例如,他们所在的邮件列表、正在发送的电子邮件类型等)每个人是否仅包含姓名和电子邮件地址,或者是否涉及其他属性?

    Google suggests a a few other alternatives:

    如果您的应用程序可能会遇到较重的写入使用,您可能需要考虑使用其他方式:例如,您可以将最近的帖子放入具有过期时间的 memcache 并显示最近的混合来自 memcache 和 Datastore 的帖子,或者您可以将它们缓存在 cookie 中在 URL 中放置一些状态或完全其他的东西。目标是找到一个缓存解决方案,在用户发布到您的应用程序的时间段内为当前用户提供数据。请记住,如果您在事务中执行 get、put 或任何操作,您将始终看到最近写入的数据。

    所以看起来您可能想要调查这些可能性,尽管我不确定它们能在多大程度上转化为您的应用所需的内容。

    原始帖子:使用ancestor queries.

    来自 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) 
    

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

    【讨论】:

      猜你喜欢
      • 2017-09-26
      • 1970-01-01
      • 1970-01-01
      • 2015-06-05
      • 1970-01-01
      • 2018-08-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多