16

今天早上,我的 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

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

4

2 回答 2

17

没有看到调用是如何进行的(您显示调用代码,但它被调用的频率,通过循环或同时调用同一个 put 的多个页面)但我相信这个问题在这里得到了更好的解释。尤其是

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

'start_at' 是罪魁祸首。这篇文章更详细地解释了。

可能(尽管未经测试)尝试分批进行放置。您是否在“start_at”字段上运行查询?如果不删除其索引也将解决问题。

puts 是如何调用的(即我上面在循环中询问的内容,多个页面调用)?这样可能更容易缩小问题的范围。

于 2014-09-12T14:45:52.163 回答
5

以下是您需要了解的有关数据存储争用以及如何避免它的所有信息: https ://developers.google.com/appengine/articles/scaling/contention?hl=en (已删除)

更新: 您正在达到同一实体组的每秒写入数限制。默认为每秒 1 次写入。 https://cloud.google.com/datastore/docs/concepts/limits

来源:https ://stackoverflow.com/a/47800087/1034622

于 2013-06-25T22:14:42.573 回答