Google Cloud Platform上的NDB查询间歇性地不返回任何内容

时间:2018-09-08 09:55:15

标签: google-app-engine google-cloud-datastore google-cloud-python

我在Google Cloud Platform上部署了Python应用程序。后台有一个Google Cloud Datastore,有两种。我使用NDB将数据拉入应用程序。

class AttEvent(ndb.Model):
  event = ndb.StringProperty()
  matchdate = ndb.DateTimeProperty()

class MainPage(webapp2.RequestHandler):

  def get(self):

    query = AttEvent.query().order(AttEvent.matchdate)
    for q in query.fetch():
        try:
          # application code

其中一种(上面的代码中的AtEvent)给我带来麻烦。该应用程序将按预期的部署时间和工作时间/天,但会间歇性地停止返回数据。调试显示q对象是AttEvent类型的合法对象,但对于 values 集合中的每个项目,它都表示“(对象没有字段)”。当应用程序代码尝试引用模型的属性(即q.event)时,它将失败。

即使我不采取任何措施,查询也会突然在几分钟/小时后再次开始工作。我看不到任何模式或明显原因。显然,从用户角度来看这不是理想的选择。

引起麻烦的种类是静态数据,实际上仅包含3个实体。另一种是事务性的,包含数千条记录,但从未表现出相同的行为。

故障的间歇性使我相信这与缓存有关,但是我对Python和GCP还是陌生的,所以我不确定。我已经尝试在查询之前执行context.clear_cache(),但是没有效果。

我缺少明显的东西吗?

1 个答案:

答案 0 :(得分:2)

我不知道为什么会这样,但是我可以解决。由于数据是静态的,并且实体看起来很小,因此您可以将它们存储在实例内存中,而不是每次需要时都对其进行查询。

将实体存储在模块级变量中,如下所示:

att_entities = AttEvent.query().order(AttEvent.matchdate).fetch()

class AttEvent(ndb.Model):
  event = ndb.StringProperty()
  matchdate = ndb.DateTimeProperty()

class MainPage(webapp2.RequestHandler):

  def get(self):
    for q in att_entities:
        try:
          # application code

只有在启动新实例时,您才可以获取实体,只要它在您第一次设置时就可以工作。另外,由于您不需要从数据存储中检索数据,因此它可以使get调用更快。

您可能需要添加额外的逻辑以使att_entities根据需要进行更新。