没有祖先的新实体导致错误"Too much contention"



今天,我在App Engine上的实时Python应用程序在十分钟内收到了大约100个请求,在向数据存储写入新实体时引发了异常,原因是"这些数据存储实体上的争用太多"。我的应用程序每个请求只写入一个实体。并非在此期间的所有请求都失败;大多数都是成功的。

几个星期以来,该应用程序每天处理大约3万个请求,没有出现任何问题,我还没有看到QPS超过20个。事实上,当请求之间的间隔大于1秒时,也有写入失败的例子。我使用的是数据库库,下面是模型定义:

class SiteImpression(db.Model):
    remoteIPAddr = db.StringProperty(required=True)
    aPersonID = db.StringProperty(required=True)
    requestURI = db.TextProperty(required=True)
    serverEnvironment = db.StringProperty(required=True)
    requestDateTime = db.DateTimeProperty(required=True)
    userAgent = db.TextProperty(required=True)

以及要写入数据存储的代码:

dtDateTime = datetime.now()
e = myd.SiteImpression(remoteIPAddr=strRemoteAddr,
                       aPersonID=straID,
                       requestURI=strRequestURI,
                       serverEnvironment=strEnvironment,
                       requestDateTime=dtDateTime,
                       userAgent=strUserAgent)
e.put()

从阅读这个SO问题的答案中,我发现这与我的索引日期时间属性导致平板电脑热有关(我在这里读到过)。我有一个用于此日期时间属性的默认索引,以及两个自定义索引:

- kind: SiteImpression
  properties:
  - name: aPersonID
  - name: serverEnvironment
  - name: requestDateTime
    direction: asc
- kind: SiteImpression
  properties:
  - name: serverEnvironment
  - name: requestDateTime
    direction: asc

我的问题是:我是做错了什么导致了这些争用问题,还是可能只是数据存储的临时问题?

谢谢。

问完这个问题后,我收到了一封来自google appengine宕机通知组的电子邮件:https://groups.google.com/forum/#!主题/谷歌呼吁引擎停机通知/cAr5V_EWs-g

在我收到错误的同一天写索引时出现了一个临时问题。

相关内容

最新更新