簡體   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