在数据存储中创建新实体时“争用过多”

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 时出现缓慢,以及在最坏的情况下超过期限的错误。不过,很高兴提及它。 (我会四处询问,以防在某些情况下速度缓慢可能会被报告为争用错误。似乎它可能......)

以上是关于在数据存储中创建新实体时“争用过多”的主要内容,如果未能解决你的问题,请参考以下文章

Core Data 自动迁移不会在我的新模型中创建新实体

在 C++ 中创建新的数据类型

我应该啥时候在 MongoDB 中创建新的集合?

带有 EF6 的 WPF 应用程序不会在 SQL Server Enterprise 中创建新数据库

如何在现有 WCF 服务中创建新方法?

如何在数据存储中创建复合索引以过滤实体中的多个属性