Python GAE/P:处理最终一致性
在五月应用程序中,我有以下过程:Python GAE/P:处理最终一致性,python,google-app-engine,google-cloud-datastore,Python,Google App Engine,Google Cloud Datastore,在五月应用程序中,我有以下过程: 得到一份很长的名单 为每个人创建一个实体 向每个人发送电子邮件(第2步必须在第3步开始前完成) 因为人的列表非常大,我不想把他们放在同一个实体组中 在执行步骤3时,我可以查询如下人员列表: Person.all() 由于最终的一致性,我可能会错过步骤3中的一些人。在第3步中,什么是确保我不遗漏任何人的好方法 有比这更好的解决方案吗 while Person.all().count() < N: pass for p in Person.all()
Person.all()
由于最终的一致性,我可能会错过步骤3中的一些人。在第3步中,什么是确保我不遗漏任何人的好方法
有比这更好的解决方案吗
while Person.all().count() < N:
pass
for p in Person.all()
# do whatever
while Person.all().count()
编辑:
我想到了另一个可能的解决办法。我可以创建一个人员的链接列表。我可以存储到第一个的链接,他可以链接到第二个,等等。但是,性能似乎会很差,因为您将分别执行每个get,并且没有查询的效率。更新:我重新阅读了您的帖子,发现您不想将它们都放在同一个实体组中。我不知道不这样做如何保证强一致性。您可能希望重新构造数据,以便不必将它们放在同一个实体组中,而是放在多个实体组中。也许取决于一组个人实体的某些方面?(例如,他们所在的邮件列表、发送的电子邮件类型等)每个人是否只包含姓名和电子邮件地址,或者是否涉及其他属性 :
如果你的应用程序可能遇到更重的写用法,你可能需要考虑使用其他方法:例如,你可以把最近的帖子放在<>强> MyCache中,期限为,并显示MyCache和DATASORE中最近的帖子的组合,或者<强>你可以将它们缓存在Cookie < /强>中,在URL中放置一些状态,或完全其他的状态。我们的目标是找到一个缓存解决方案,在当前用户发布到应用程序的时间段内为该用户提供数据。请记住,如果在事务中执行get、put或任何操作,您将始终看到最近写入的数据
所以看起来你可能想调查这些可能性,尽管我不确定它们是否能很好地转化为你的应用程序所需要的 原创帖子:使用 来自谷歌的: 要获得高度一致的查询结果,需要使用祖先查询,将结果限制为单个实体组。这是因为实体组是一致性和事务性的一个单元。所有数据操作都应用于整个组;在整个实体组更新之前,祖先查询不会返回其结果。如果应用程序依赖于某些查询的强一致性结果,那么在设计数据模型时可能需要考虑这一点。本页讨论构建数据以支持强一致性的最佳实践 因此,在创建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)