google-app-engine - Google Cloud Platform 上的 ndb 查询间歇性地返回任何内容

标签 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)时,它会失败。

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

导致问题的 Kind 是静态数据,实际上只包含 3 个实体。另一种是事务性的,包含数千条记录,但从未表现出相同的行为。

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

我是否漏掉了一些明显的东西?

最佳答案

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

像这样将实体存储在模块级变量中:

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 根据需要进行更新。

关于google-app-engine - Google Cloud Platform 上的 ndb 查询间歇性地返回任何内容,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/52234110/

相关文章:

google-app-engine - 如何链接来自不同存储库的 cloudbuild.yaml(Google Cloud Build 触发器)

java - Google Cloud Endpoint Backend - 是否可以检索 HttpSession 的属性?

google-app-engine - GAE 数据存储 : filter by date interval

python - 如何在Python中使用NDB查询从数据存储中删除数据?

python - 如何修复将文件上传到 Google Cloud Storage 时的内存泄漏?

java - 如何删除 .jsp 中的 blob

google-app-engine - 将 Google App Engine 与 GoDaddy 域结合使用

google-app-engine - 大查询 : How to flatten repeated structured property imported from datastore

python - 通过 gcloud api 中的键查询 google 数据存储

google-cloud-platform - 如何使用 Python SDK 在 us-east4 区域的 Dataproc 上提交作业