GAE数据存储区恢复停止,API调用urlfetch.Fetch()花了太长时间才响应并被取消

时间:2016-07-03 21:12:37

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

我正在关注本指南https://cloud.google.com/appengine/docs/python/console/datastore-backing-up-restoring#restoring_data_to_another_app 如何在一个GAE应用程序中备份数据并在另一个应用程序中恢复它。

但每次我在目标应用程序上恢复备份时都会收到错误:

The API call urlfetch.Fetch() took too long to respond and was cancelled.

任何想法我做错了什么?

1 个答案:

答案 0 :(得分:1)

你的urlfetch.Fetch()花了太长时间(大于60秒)来重新生成,所以它超时了。这是一篇关于它的文章https://cloud.google.com/appengine/articles/deadlineexceedederrors

一种解决方案是使用任务队列。任务队列具有更长的超时,或者更合适的是,允许您将作业分成更小的部分。 https://cloud.google.com/appengine/docs/python/taskqueue/

这是一个简单的例子,说明如何使用" push"任务队列。我意识到从一个数据存储模型到另一个模型可能不是您正在寻找的冗余。您可能希望将数据存储区实体完全备份到另一个应用程序或另一种类型的数据库或云服务。您可能还有多个要备份的模型。这只是设置和安排" push"的一个简单示例。每24小时使用一次cron作业的任务队列:

首先你必须添加" deferred"到app.yaml中的内置组件:

builtins:
- deferred: on

接下来,您需要创建我们将调用的第二个数据存储模型" Backup"只需复制粘贴您的旧模型并重命名为备份 - 它有助于使用相同模型的相同版本进行备份而不是相同的模型,因为您可以为它们提供相同的主要和备份相同的密钥:

class Backup(db.Model): # example
    prop1 = db.StringProperty()
    prop2 = db.StringListProperty()
    prop3 = db.StringProperty()

接下来在cron.yaml中设置一个cron作业:

- description: Creates a backup of the target db every 24 hours at 10:45 GMT
url: /backup
schedule: everyday 10:45

添加/备份到您的app.yaml处理程序:

- url: /backup
script: mybackup.py
login: admin

最后,创建mybackup.py

from google.appengine.ext import deferred
from google.appengine.ext import db
#from google.appengine.ext import ndb

def backup_my_model(model_name):
    """
    Takes all enities in the model_name model and copies it to Backup model
    """
    logging.info("Backing up %s" % model_name)
    query = db.GqlQuery('SELECT * From %s ' % model_name)
    for primary_db in query:
        backup = Backup(key_name = primary_db.key_name)
        backup.prop1 = primary_db.prop1
        backup.prop2 = primary_db.prop2
        ...
        backup.put()



deferred.defer(backup_my_model, MyModel) #where MyModel is the model you want to backup
deferred.defer(backup_my_model, MyOtherModel)
...
deferred.defer(backup_my_model, MyFinalModel)

我希望有所帮助。