客观化查询和奇怪的最终一致性

时间:2013-11-07 14:05:44

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

我看到一些与客体化和最终一致性相关的奇怪行为。我在运行一些集成测试时注意到了这种行为,这些测试向App Engine Java开发服务器发出HTTP请求。

由于我希望这些测试在针对真实的应用引擎环境运行时也能正常工作,因此他们通过重复基于最终一致查询返回结果的请求来处理最终的一致性。

我之前在web.xml中的错误位置偶然发现了ObjectifyFilter,因此ObjectifyFilter无法运行。现在我将它移动到过滤器链的开头,以便它实际运行,我的所有查询似乎总是返回一致的结果!没有最终的一致性,就是这样!

例如,一项测试执行以下操作:

  1. 为用户添加一些用户名的请求
  2. 尝试使用用户名和密码授权用户的请求。这将为具有给定用户名的用户进行全局查询,并且查询最终应该是一致的,但它始终会找到用户实体。
  3. 我不知道发生了什么。

    更多信息:

    • 我检查了ofy()。toString为每个请求返回一个不同的值。
    • 我正在使用-Ddatastore.default_high_rep_job_policy_unapplied_job_pct = 50
    • Appengine SDK版本1.8.6
    • 我在交易中进行所有写入

1 个答案:

答案 0 :(得分:0)

禁用测试中的最终一致性。添加重试和休眠不会改变代码的逻辑,只会使测试变得复杂。尝试测试最终的一致行为是没有意义的;请注意它存在。

我不知道您具体问题的答案,因为它实际上是关于测试工具的具体行为。仔细阅读单元测试指南;未应用的作业应用于奇数点,如第二次运行查询。它只是服务器环境最终一致行为的非常粗略的近似值。