【问题标题】:App engine datastore inconsistent?应用引擎数据存储不一致?
【发布时间】:2013-03-06 18:53:25
【问题描述】:

这太奇怪了……

首先,此查询在数据存储查看器中工作,即。它返回正确的行。

SELECT * FROM Level where short_id = 'Ec71eN'

但是如果我运行这个

Level.all().filter("short_id = ", 'Ec71eN').get()

如果我运行它,它会返回 None

db.GqlQuery("SELECT * FROM Level where short_id = '%s'" % 'Ec71eN').get()

它也返回。如果我运行这个:

level = Level.get_by_id(189009)

它返回正确的行(189009是正确行的id)

令人困惑?这里有什么问题?我以前从未见过这样的东西,它至少在生产中正常工作了几周......我想我现在至少有两个案例从今天开始就不能工作了。


更新:这不可能是一个最终一致的问题,因为当我尝试上述操作时,该行已经 7 小时了。我有两排症状相同,奇怪的是同一用户生成的展位。在我通过上传特殊情况代码(例如:

if short_id==CASE_1_SHORT_ID: 
     level = Level.get_by_id(CASE_1_ID)

之后查询照常工作。

【问题讨论】:

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


    【解决方案1】:

    您在使用 HRD 吗?什么都没有。你知道它应该是最终一致的吗?

    查询操作最终是一致的。 Get-by-id 操作完全一致。

    您所描述的是正确的数据存储行为。数据存储查看器操作返回正确的结果有点奇怪,但它可能在数据存储操作上命中了单独的平板电脑。

    【讨论】:

    • 是 HRD,但此行是在 7 小时前创建的。没有上限?如果有这样的情况,设计一个系统有点困难。
    【解决方案2】:

    鉴于它是在 7 小时前创建的,“最终一致性”通常应该需要几秒钟到几分钟的时间。 如果最终一致性是问题,请多次运行相同的查询方法,看看是否返回相同的结果。如果它使用相同的方法连续返回相同的结果,那么它很可能不是最终的一致性问题。您也应该切换到 NDB API 来查询数据 - 它好 1000 倍,而且 Guido 也致力于它 - 所以你知道它很好。 NDB 是否表现出同样的不一致?

    【讨论】:

    • 我不知道 NDB API,我一定会调查的。 (主要使用java和app引擎,最近改用python。)我有两个案例展位至少5-7个小时。在我手动执行 get_by_id 后,展位“已修复”(使用失败的 short_id 的 if 语句上传新版本)。所以这不是 EC 的事情,这是某种错误。
    猜你喜欢
    • 2014-10-21
    • 1970-01-01
    • 2012-11-24
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2014-08-19
    • 1970-01-01
    相关资源
    最近更新 更多