在dataStore中创建新实体时"太多争用"

Jam*_*Gan 12 python google-app-engine google-cloud-datastore

今天早上,我的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
Run Code Online (Sandbox Code Playgroud)

这对我来说很神秘.我想知道如何处理这个问题.如果有任何建议,请告诉我.

Rya*_*yan 12

没有看到调用是如何进行的(你显示调用代码但调用频率,通过循环或许多页面同时调用相同的put)但我相信这个问题在这里有更好的解释.特别是

如果使用单调递增的索引属性(如时间戳)以高速率创建新实体,也会看到此问题,因为这些属性是Bigtable中索引表中行的键.

'start_at'是罪魁祸首.该文章详细介绍了.

可能(虽然未经测试)尝试分批进行投入.你在'start_at'字段上运行查询吗?如果不删除其索引也将解决问题.

如何调用看跌期权(即我在循环中询问的内容,多页调用)?有了它,可能更容易缩小问题范围.


Pab*_*hvx 6

以下是您需要了解的有关数据存储区争用以及如何避免它的所有信息:

https://developers.google.com/appengine/articles/scaling/contention?hl=en

希望能帮助到你

  • 这没有回答这个问题:据我所知,从文档中可以看出,当你创建一个新的无祖先实体时,你会创建一个新的实体组,那么在创建时如何才能获得争用呢?似乎文档几乎没有划分"你需要了解的数据存储争用"的表面 (3认同)