【问题标题】:GAE datastore restore stops with The API call urlfetch.Fetch() took too long to respond and was cancelledGAE 数据存储恢复停止,API 调用 urlfetch.Fetch() 响应时间过长并被取消
【发布时间】:2016-07-03 21:12:36
【问题描述】:

我正在关注本指南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.

任何想法我做错了什么?

【问题讨论】:

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


    【解决方案1】:

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

    一种解决方案是使用任务队列。任务队列有更长的超时时间,或者更恰当地说,让您将作业分成更小的部分。 https://cloud.google.com/appengine/docs/python/taskqueue/

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

    首先你必须在你的 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)
    

    希望对你有帮助。

    【讨论】:

    • 我正在使用 Datastore Admin,据我所知,无法设置要使用的任务队列:screencast.com/t/H6cTrvvr
    • 为了完成您尝试执行的任务,您必须使用您的应用程序而不是数据存储区管理员来完成。我将更新我的代码以提供一个简单示例,说明如何从一个数据存储模型到另一个模型。
    • 我正在尝试备份我的生产数据库并在我的测试环境中恢复它。所以我试图将数据从生产谷歌应用引擎应用程序复制到谷歌应用引擎测试应用程序。据我所知,您上面的代码将数据复制到同一应用程序中的另一个模型,而不是跨应用程序?
    猜你喜欢
    • 1970-01-01
    • 2020-06-26
    • 2020-02-05
    • 2019-03-09
    • 1970-01-01
    • 2018-04-09
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多