Google Appengine数据存储何时可以返回陈旧数据?

时间:2014-02-12 14:56:38

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

我可以从这段代码中得到的结果有什么不同:

query = MyModel.all(keys_only=True).filter('myFlag', True)
keys = list(query)
models = db.get(keys)

与此代码对比:

query = MyModel.all().filter('myFlag', True)
models = list(query)

,两者中models是否相同?

如果没有,为什么不呢?我原以为最终的一致性用于描述模型的索引如何花费一段时间来更新,因此可能与最近编写的数据不一致。

但我最近经历过一个案例,我实际上从第二个查询中获取陈旧数据,其中model.myFlagTrue用于通过查询检索的模型,False当我实际上是通过钥匙获得了模型。

那么在这种情况下,myFlag的数据来自哪里?

通过密钥获取实体是否确保跨数据存储节点复制并返回最新数据,而通过查询获取实体只是从最近的数据存储节点检索数据?

修改 我读了这篇文章,并假设Cloud Datastore的工作方式与Appengine Datastore相同,我的问题的答案是肯定的,从查询返回的实体可能有陈旧的值。

https://cloud.google.com/developers/articles/balancing-strong-and-eventual-consistency-with-google-cloud-datastore#h.tf76fya5nqk8

1 个答案:

答案 0 :(得分:2)

是的,正如您所提到的,查询可能会返回陈旧的值。执行查询时,数据存储区会选择性能而不是一致性。

更深入:对于实体组,每个节点都有一个尚未应用的写入日志。执行读取或祖先查询时,首先涉及的实体组应用其日志。但是,当您执行普通查询时,结果可能来自任何实体组,因此实体组不会被捕获。但是要小心使用第一个代码示例,用于实际查找这些实体的索引可能不是最新的。因此,很有可能无法使用myFlag = True获取所有实体。如果您有兴趣,我建议您阅读Megastore paper