【问题标题】:When can Google Appengine datastore return stale data?Google Appengine 数据存储何时可以返回陈旧数据?
【发布时间】:2014-02-12 14:56:37
【问题描述】:

我可以从这段代码中得到的结果是否有所不同:

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 的数据来自哪里?

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

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

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

【问题讨论】:

  • 强调您的编辑是正确的,如果您想获得强一致性,请始终使用键或祖先查询。 @Patrick Costello 为您提供保障。

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


【解决方案1】:

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

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

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2015-06-16
    • 2015-04-07
    • 1970-01-01
    • 1970-01-01
    • 2019-01-24
    • 2023-03-10
    • 2023-03-04
    • 2017-01-01
    相关资源
    最近更新 更多