3

GAE 的现有持久性框架,如ObjectifyDatanucleusTwig等,如何处理数据存储的“最终一致”性质?

我正在使用DatastoreService层中的数据存储(我现在没有使用这样的持久性框架)。

在我的单元测试期间,我有时会得到正确的对象计数,有时不会。这是预期的。

这是我的 JUnit 助手配置:

private final LocalServiceTestHelper helper =
    new LocalServiceTestHelper(new LocalDatastoreServiceTestConfig()
        .setDefaultHighRepJobPolicyUnappliedJobPercentage(50)); 

现在,即使我已将 put/get 方法放置在重试的 do-while 循环中(重试次数为 4),它仍然会错过 put/get 实体。

那么现在,对于那些指定的框架,他们是否能够保证如果我放置 3 个对象,我将得到 3 个对象?如果是这样,它是如何实施的?

我唯一能想到的就是使用 Memcache,也就是说,我的方法会首先尝试从中获取实体,如果它错过了,它会检查数据存储区。这是一种合理的方法,还是有更好的方法或正确的方法?

4

3 回答 3

2

如果您想要查询的强一致性,那么有两种选择:

  1. ) 使用 祖先 查询。

  2. ) 使用数据存储获取 操作而不是查询,它们是强一致的。

如果您仔细构造键名,通常可以使用获取而不是查询。如果您需要查询以使给定用户“显示”一致,您的另一个选择是应用一个小技巧:将用户更改注入结果中。因此,如果他们更改了姓名并且您重定向到他们的个人资料页面,请在发送之前将他们的更改注入结果中。

于 2013-04-21T17:34:22.233 回答
2

Objectify 不任何方式、形状或形式处理最终的一致性。作为开发人员,您在使用 Objectify 或任何其他库时必须牢记这一点。

围绕查询的 do/while 循环或添加 wait() 无法保证强一致性。充其量你会增加获得最新结果的可能性,但这还远不能确定。

Memcache 在这里也没有真正提供任何保证,因为它是不可靠的存储。memcache put() 函数作为 NO-OP 是完全合法的,即什么也不做。

为了解决您的核心问题,您需要以使用强一致性的方式设计您的应用程序。因此,您可以使用高度一致的数据存储读取操作,例如获取或祖先查询。或者您可以通过 HTTP 传递一些数据。

于 2013-04-21T08:00:29.510 回答
1

如果您需要 Objectify 中的强一致性,那么您可以执行祖先查询,请参阅本文以获取解释和示例。但是,这比最终一致的查询更昂贵,因此尽可能支持最终一致的查询。

于 2013-04-21T15:00:28.567 回答