Java 即使在放置新的根实体时,应用程序引擎也会发生争用

Java 即使在放置新的根实体时,应用程序引擎也会发生争用,java,google-app-engine,Java,Google App Engine,我正在试验Google App Engine(高复制数据存储) 我知道频繁写入单个实体组会导致争用。 为了避免这种情况发生,我的实体都是根实体,即每个实体都是一个单独的实体组 我开始交易 获取实体 如果它已经存在,请回滚事务 否则放入实体并提交事务 因此,我认为我是在利用应用程序引擎声称的非相关实体(即不在同一实体组中的实体)的高吞吐量优势 然而,有时候,我会遇到一个可怕的例外“这些实体上的争论太多”。为什么不在同一组中的实体会发生争用 我们被告知,对于单个实体组,每秒的写入次数不超过1到10次

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

我开始交易

获取实体

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

否则放入实体并提交事务

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

然而,有时候,我会遇到一个可怕的例外“这些实体上的争论太多”。为什么不在同一组中的实体会发生争用

我们被告知,对于单个实体组,每秒的写入次数不超过1到10次

但我还没有看到一个数字,我们可以期望应用程序引擎处理对不同实体组的写入 争论似乎发生在我认为相当低的要求(大约每秒100次)

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


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

您的第一个错误是使用实体组。它们根本不是为了避免争论。这正是奥波西特。不能经常更新实体组中的项目,请参阅文档。实体组对于一致的读取非常有用,而不是争用或速度。

不确定如何删除答案,因此我正在编辑此答案

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

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

所以我不明白这个“争论”是从哪里来的

这似乎是一个单一的要求是'竞争'本身

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


由于这些是独立的实体组,我认为问题一定是由“平板电脑拆分”等引起的。如果是这种情况,我认为所有这些故障都作为ConcurrentModification异常呈现给调用方是一件很遗憾的事情。我认为,能够区分由于数据存储中的内部进程而导致的操作失败和更正常的问题(例如,在您之前另一个用户修改了数据)是非常有用的。如果您按照txn插入单个实体,则PSEDOO代码看起来是正确的

同样正确的是,非相关的根实体插入应该防止争用

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

然而,txn中有5个实体组限制

来解决你的问题

  • 使用txn进行单个实体更新

  • 还是把txn限制在哈?我读过一些文件,但似乎和你的不一样。实体组当然对绩效有影响。此外,我想知道如何避免我的“第一个错误”,因为不可能有一个实体不在实体组中,您从哪里得到所有实体都必须属于一个实体组?这不是真的。我唯一读到的文件是谷歌的官方文件。它对实体组争用和限制进行了相同的解释。实体组通常用于存储用户数据,并以单个用户所能达到的速度对其进行更改。它比无根实体慢得多。从实体、属性和种类:一个实体及其子实体被称为属于同一个实体组。或者更确切地说,从事务:每个实体都属于一个实体组,一组可以在单个事务中操作的一个或多个实体。不管你是否想把单个根实体看作它自己的实体组,关键是从事务的角度来看,单个根实体的行为就像一个只有一个实体的组。