Google数据存储模拟器

时间:2017-04-21 11:48:19

标签: testing indexing google-cloud-datastore emulation

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

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

SELECT [..] WHERE myfield = true

如果我们针对在Google Cloud上托管的“实时”商店进行此操作。

可是:

当我们针对本地运行的模拟器运行相同的代码时,插入工作正常,但查询却没有。 findAll()工作正常,所以看起来像插入和读取工作一般,但不知何故索引丢失了?

现在阅读文档数小时后,我没有找到任何提示,为什么会发生这种情况。

有人可以帮忙吗?

2 个答案:

答案 0 :(得分:2)

您最常遇到的是 - 最终的一致性。默认情况下,数据存储模拟器模拟0.9的一致性。请注意,除非WHERE子句是Key或查询是Ancestor Query,否则大多数查询最终都是一致的。我相信你很幸运,#34;生活"商店正在返回结果。如果您在一天中的不同时间运行测试足够多次,则可能无法返回结果(这一切都取决于更新索引所需的时间和时间)。

也就是说,数据存储模拟器可以选择指定它应该模拟的一致性级别。这可以使用以下命令完成:

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

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

再一次,"直播"除了上面提到的少数例外情况之外,数据存储总是最终符合所有情况。

答案 1 :(得分:0)

为了不让人们与我原来的问题混淆,我回答自己,因为我们找到了问题的根源。

不幸的是,实时和本地之间的区别不是由于数据存储区一侧的行为有所不同,而是根植于我们的代码中。 : - (

据我所知,我们之前关于未生成索引的所有假设都是错误的。在这方面,本地行为与现实完全一样。

感谢您的贡献!