繁体   English   中英

GAE数据存储区还原因API调用urlfetch.Fetch()花费了太长时间而无法响应,因此被取消

[英]GAE datastore restore stops with The API call urlfetch.Fetch() took too long to respond and was cancelled

我正在按照本指南https://cloud.google.com/appengine/docs/python/console/datastore-backing-up-restoring#restoring_data_to_another_app的说明 ,了解如何在一个GAE应用程序中备份数据并在另一个GAE应用程序中还原数据。

但是每次我在目标应用程序上还原备份时,都会收到错误消息:

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

有什么想法我做错了吗?

您的urlfetch.Fetch()花费的时间太长(超过60秒)而无法响应,因此它超时了。 这是一篇关于它的文章https://cloud.google.com/appengine/articles/deadlineexceedederrors

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

这是一个简单的示例,说明如何使用“推送”任务队列执行此操作。 我意识到从一种数据存储模型过渡到另一种数据存储模型可能并不是您要寻找的冗余。 您可能希望将数据存储区实体完全备份到另一个应用程序或另一种类型的数据库或云服务。 您可能还需要备份多个模型。 这只是一个简单的示例,它每24小时使用cron作业设置和安排“推送”任务队列:

首先,您必须在app.yaml中的内置函数中添加“ deferred”:

builtins:
- deferred: on

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

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

将/ backup添加到您的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)

希望对您有所帮助。

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM