Google 数据存储模拟器

Google Datastore Emulator

为了进行测试,我们使用 Google 提供的 LocalDatastoreHelper class 启动云数据存储模拟器的本地实例。

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

SELECT [..] WHERE myfield = true

如果我们针对托管在 Google Cloud 的 "live" 商店执行此操作。

但是:

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

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

有人可以帮忙吗?

很可能您 运行 想要的是 - 最终一致性。默认情况下,数据存储模拟器模拟 0.9 的一致性。请注意,大多数查询最终是一致的,除非 WHERE 子句是一个键或查询是一个祖先查询。我相信您很幸运,"live" 存储 return 结果。如果您在一天中的不同时间 运行 测试足够多次,则可能不会 return 结果(这完全取决于时间和更新索引所需的时间)。

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

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

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

同样,"live" 数据存储在所有情况下始终是最终一致的,除了我上面提到的少数例外情况。

为了不让别人误会我原来的问题,我自己回答,因为我们找到了问题的根源。

不幸的是,实时和本地之间的差异不是由于数据存储端的某些行为差异造成的,而是植根于我们的代码中。 :-(

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

感谢您的贡献!