今天,我在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
在我收到错误的同一天写索引时出现了一个临时问题。