为了进行测试,我们使用Google提供的LocalDatastoreHelper类启动了cloud-datastore-emulator的本地实例。

我们所做的有趣的观察是,可以通过执行GQL查询将数据插入我们的代码中,然后再次找到它们

SELECT [..] WHERE myfield = true

如果我们针对Google Cloud托管的“实时”商店这样做。

但:

当我们针对本地运行的模拟器运行相同的代码时,插入有效,但查询无效。 findAll()可以正常工作,因此看起来插入和读取通常都能正常工作,但是不知何故缺少索引?

在阅读了几个小时的文档之后,我没有发现任何提示,为什么会发生这种情况。

有人可以帮忙吗?

最佳答案

您最有可能遇到的是-最终的一致性。默认情况下,数据存储区模拟器会模拟0.9的一致性。请注意,大多数查询最终都是一致的,除非WHERE子句是键或查询是祖先查询。我相信您很幸运“实时”商店返回了结果。如果您在一天的不同时间运行测试足够的时间,则可能无法返回结果(这完全取决于更新索引的时间和时间)。

也就是说,数据存储区仿真器具有一个选项,可以指定应模拟的一致性级别。可以使用以下命令完成此操作:

gcloud beta emulators datastore start --data-dir=/my/data/dir --host-port localhost:9999 --consistency 1.0


一致性级别1.0将保证一致的读取。我不确定是否可以使用LocalDatastoreHelper设置一致性级别。

同样,除了我上面提到的一些例外之外,对于所有情况,“实时”数据存储区最终始终是一致的。

09-25 17:59
查看更多