在数据存储中创建新实体时“争用过多”
Posted
技术标签:
【中文标题】在数据存储中创建新实体时“争用过多”【英文标题】:"Too much contention" when creating new entity in dataStore 【发布时间】:2013-06-22 21:22:01 【问题描述】:今天早上,我的 GAE 应用程序生成了几个错误日志:“这些数据存储实体的争用过多。请重试。”。在我看来,只有当多个请求尝试修改同一个实体或同一个实体组中的实体时,才会发生这种类型的错误。
当我收到此错误时,我的代码正在插入新实体。我糊涂了。这是否意味着我们创建新实体的速度会受到限制?
我的模型定义和调用顺序代码如下:
# model defnition
class ExternalAPIStats(ndb.Model):
uid = ndb.StringProperty()
api = ndb.StringProperty()
start_at = ndb.DateTimeProperty(auto_now_add=True)
end_at = ndb.DateTimeProperty()
# calling sequence
stats = ExternalAPIStats(userid=current_uid, api="eapi:hr:get_by_id", start_at=start_at, end_at=end_at)
stats.put() # **too much contention** happen here
这对我来说很神秘。我想知道我将如何处理这个问题。如果有任何建议,请告诉我。
【问题讨论】:
我有同样的问题。我正在使用管道。我在运行管道时put()
一个新实体。我的代码未包含在事务中(无论如何都不是我自己制作的),但我 put
的行显示为 TransactionFailedError(too much contention on these datastore entities. please try again.)
我无法在文档中找到此行为的解释
我只是注意到这是对一个已有一年的问题的新赏金。 :) Anentropic,您是否使用具有共同祖先的键创建实体?在同一个实体组中创建新实体相当于对同一个组进行并发更改,即使您没有使用显式事务,这些也会竞争访问。 (如果没有显式事务,则每个操作都在其自己的隐式事务中。)如果您不相信您在键中使用了共同的祖先,您可以发布您的代码,可能是一个新问题吗?
@DanSanderson 实际上我是,我以为我不是,但事实证明我是。不过,由于“热平板电脑”问题,似乎仍然有可能获得 OP 所描述的那种争论......我发现 Bruyere 发布的那篇文章作为答案,它也被埋在某个地方的文档中
哦,我看到你已经回复了 :)
是的,我找人确认了争用错误严格来说是关于争用的,热平板电脑会导致缓慢或可能超时。很高兴它成功了!
【参考方案1】:
以下是您需要了解的有关数据存储争用以及如何避免它的所有信息: https://developers.google.com/appengine/articles/scaling/contention?hl=en (已删除)
更新: 您正在达到同一实体组的每秒写入数限制。默认为每秒 1 次写入。 https://cloud.google.com/datastore/docs/concepts/limits
来源:https://***.com/a/47800087/1034622
【讨论】:
这没有回答这个问题:据我从文档中了解到,当您创建一个新的无祖先实体时,您会创建一个新的实体组,那么怎么可能发生争用创建的时候?似乎文档几乎没有触及“您需要了解的有关数据存储争用的内容”的表面 链接不再导航到任何有价值的地方【参考方案2】:没有看到调用是如何进行的(您显示调用代码,但它被调用的频率,通过循环或同时调用同一个 put 的多个页面)但我相信这个问题可以更好地解释 here。特别是
如果您使用单调递增的索引属性(如时间戳)高速创建新实体,您也会看到此问题,因为这些属性是 Bigtable 中索引表中行的键。
“start_at”是罪魁祸首。这个article解释得更详细。
可能(尽管未经测试)尝试分批进行放置。您是否在“start_at”字段上运行查询?如果不删除其索引也将解决问题。
puts 是如何调用的(即我上面在循环中询问的内容,多个页面调用)?这样可能更容易缩小问题的范围。
【讨论】:
由于附近的属性索引行导致的“热平板电脑”问题不应导致争用错误,仅在高 QPS 时出现缓慢,以及在最坏的情况下超过期限的错误。不过,很高兴提及它。 (我会四处询问,以防在某些情况下速度缓慢可能会被报告为争用错误。似乎它可能......)以上是关于在数据存储中创建新实体时“争用过多”的主要内容,如果未能解决你的问题,请参考以下文章