【问题标题】:gae unit testing hrd datastore inconsistencygae单元测试hrd数据存储不一致
【发布时间】:2012-02-27 05:40:20
【问题描述】:
facade.vote(datastoreRecordId, userId);
try{
    facade.vote(datastoreRecordId, userId);
    fail(); // Expect runtimeexception because voting twice is not allowed
} catch (RuntimeException ex) {}

hasVoted = facade.hasVoted(datastoreRecordId, userId);

我有一个单元测试,测试我的 gae 服务器的外观。 服务器在 localhost 上运行,每次在 setup 方法中都会擦除数据存储区。

我将一个实体放入数据存储区,然后我基本上检查它是否正确持久化!有时它告诉我记录已找到,有时它告诉我它没有找到。 (所以 hasVoted 有时为真有时为假,有时会抛出预期的运行时异常,有时不会)

我尝试使用全局事务,在本地和服务器端同步,并尝试使用单线程 HttpClient。我什至在对我的门面的调用之间放了一些睡眠。我还尝试了 appengine.xml 中的线程开关。

我做了一个方法,我连续运行测试 100 次,有时它有效,有时断言在 4 次运行后失败,有时在 7 次后,(16 是记录哇)它完全随机。我只是无法找出问题所在。当我在远程 appengine 实例上运行测试时,一切正常,即使我在循环中运行了 100 次。除了格式 c: 之外的任何想法?

好吧,我发现了问题,我禁用了 HRD 并在本地转移到主/从,现在一切正常!也许这篇文章可以帮助将来的人。有人了解 HRD 的这种行为吗?

【问题讨论】:

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


    【解决方案1】:

    HRD 是"eventually consistent",这意味着当您编写实体时,它会异步发生:write 方法在数据实际保存在 Datastore 之前返回。因此,如果您在写入后立即查询实体,您可能找不到它。

    为什么会这样? Datastore 需要一些时间来持久化它并创建索引 - 请阅读 Life of a Datastore Write。

    注意:HRD 的“最终一致性”只影响查询。如果你先put() 然后get() 你应该总是得到实体。

    因此,您所看到的问题只有在您使用查询时才会发生。此外,这个问题也应该出现在生产服务器上(但您可能不会在测试设置下遇到它)。

    【讨论】:

    • 在生产中我已经设置了主/从 :) 是的,这是一个查询。谢谢彼得!
    猜你喜欢
    • 1970-01-01
    • 2012-03-09
    • 1970-01-01
    • 2013-07-25
    • 2018-09-15
    • 2010-11-12
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多