Google App Engine 中的同步性和数据存储

Synchronicity and the Datastore in Google App Engine

我的一些数据似乎存在一致性问题;我正在编写单元测试以查看某个模型是否已放置在数据存储区中。它在单元测试中失败,除非我在存储功能的 return 之前放置 5 秒睡眠。

我一直在阅读 gae 中的异步函数,认为也许我需要一些类似于承诺的东西,以便函数在 returning 之前等待,直到数据被放入数据存储区.然而,所有关于 GAE 中函数的异步版本的文档似乎都暗示它的非异步函数已经在某种程度上像承诺那样起作用了。

像 put() 这样的函数对 return 意味着什么?这似乎并不意味着数据已被妥善存储。有没有办法等到数据存储完成?

编辑:我的问题不仅仅是处理一致性问题,而是我不确定问题是否完全是一致性问题,而是想具体询问 return 的调用方式put() 与 GAE 引擎盖下发生的事情有关。

我认为这个问题与列出的问题类似,但仍然有用,因为它从不同的角度处理了一致性问题。如果其他人需要查找这些信息,但并不像我一样完全确定措辞,或者遵循与我类似的思路,他们可能能够通过这个问题获得信息。它也写得更明确,领域特定术语更少。

话虽如此,我确实从最终目标信息内容的角度来看这个问题;如果它被取下,我会理解的。

https://cloud.google.com/appengine/docs/java/datastore/#Java_Datastore_writes_and_data_visibility

数据写入分两个阶段进行,即提交和应用。 Commit 将事务记录到大多数副本,apply 并行执行两件事:1) 写入数据和 2) 写入索引。

您的单元测试查询可能在具有陈旧数据版本的副本上执行。写操作 returns 紧接在提交阶段之后,但应用阶段是异步发生的。然而,祖先查询保证是最新的,因此请尝试通过获取对象键进行测试。