0

我正在尝试使用 Google App Engine(高复制数据存储)我了解频繁写入单个实体组可能会导致争用。正是为了避免这种情况发生,我的实体都是根实体,即每个实体都是一个单独的实体组。

我开始交易

获取实体

如果它已经存在,则回滚事务

否则放置实体并提交事务

所以我认为我正在利用应用程序引擎声称的非相关实体(即不在同一实体组中的实体)的高吞吐量优势

然而,有时候,我会得到一个可怕的例外“对这些实体的争论太多”。为什么要对不在同一组中的实体进行争用?

我们被告知,对于单个实体组,我们可以预期每秒不超过 1 到 10 次写入。

但我还没有看到我们可以期望应用程序引擎处理写入单独实体组的数字我认为竞争似乎发生在我认为非常低的需求(每秒大约 100 次写入)

我错过了什么吗?除了拥有单独的实体组之外,是否还有其他规则需要遵守才能获得高吞吐量?

还是我对每秒至少数百次写入的期望太高了?

4

3 回答 3

1

如果您为每个 txn 插入一个实体,您的伪代码看起来是正确的。

你也是正确的,非相关的根实体插入应该防止争用。

我在一个请求中更新多个根实体,因此另一个请求不可能同时修改与我的请求相同的数据

但是,一个 txn 中有 5 个实体组限制。在 txn 中可以做什么

解决您的问题

  1. 使用 txn 进行单个实体更新
  2. 或将 txn 限制为 <5 个实体。

-lp

于 2014-01-31T02:29:09.197 回答
0

您的第一个错误是使用实体组。它们根本不是为了避免争用。它的确切对面。您不能太频繁地更新实体组上的项目,请参阅文档。实体组对于一致读取而不是争用或速度很有用。

于 2013-10-05T14:23:26.973 回答
0

不知道如何删除答案,所以我正在编辑这个答案。

异常的 getMessage 返回“争用过多”消息。但是异常的类是 ConcurrentModification。

我在一个请求中更新多个根实体,因此另一个请求不可能同时修改与我的请求相同的数据

所以我不明白这种“争执”从何而来。

似乎单个请求正在与自己“竞争”!

一个想法是,由于 put 的异步特性,那么第一个操作在后面的操作出现之前还没有完全完成?

由于这些是单独的实体组,我认为问题一定是由“平板电脑拆分”等原因引起的。如果是这种情况,我认为所有这些失败都作为 ConcurrentModification 异常呈现给调用者是一种耻辱。我认为能够区分由于数据存储中的内部进程而导致的失败操作和更正常的问题(例如另一个用户在您之前修改了数据)会很有用

于 2013-10-05T20:07:37.437 回答