2012-04-05 12 views
1

Google App Engineアプリケーションを実装しました。このアプリケーションは、Google Docsの特定のフォルダに文書をアップロードします。 Google Docs内の特定のフォルダを検索するときに、1ヵ月前に応答時間の問題(GdataClient.GetDocList、Gdata Clientのfetch-url呼び出しで期限を過ぎた)を開始しました。これにより、多くのタスクがタスクキューにキューイングされました。Google App Engine AppのGoogle Docs APIへのアクセスがブロックされる可能性があります

私はこれを見て、しばらくの間、キューを一時停止しました。約24時間です。キューを再起動したときに、ファイル/タスクのうち10個を除いて、ほとんどすべての場所が再びアップロードされました。

私はGetDocList呼び出しを実装しましたが、私は自分の.GetNextLink().href-loop中に時々断続的な "DeadLineExceeded"を避けるために再試行/スリープ機能を実装しました。私はこれが良い "クラウド"デザインではないことを知っています。しかし、私はそれを生産のために十分に安定させるためにこれを強制した。すべての睡眠のために、私は待機時間を延長し、私は5回だけ再試行します。最後に私は約25秒待ってから再試行します。

私は、キュー内のすべてのタスクが何度も再試行されたと考えています(シリアルモードでタスクを1つずつ実行することを制限していますが、最大5分)、App Engine App Google Docs APIからブラックリストに載っている。

これは起こりますか?

同じApp EngineインスタンスからGoogle Docs Apiを再度照会するには、何が必要ですか?

App Engineアプリを新しいApplication IDに移行する必要はありますか?

開発環境からこのコードを試すと、コードは機能し、フォルダ構造を照会して制限時間内に結果を返します。

私が照会しているフォルダ構造はかなり大きいです。つまり、.GetNextLink()。hrefを使用して取得する必要があります。私の開発環境では、folderstructureははるかに少ないフォルダを含んでいます。

とにかく、これは生産AppEngineインスタンスで約1年間非常に有効です。しかし、3月4日〜5日頃に作業をやめました。

現在照会されるユーザーアカウントは、使用可能な205824 MBのうち7000 MB(3%)を使用しています。

dev-envのコードを使用しても、Google Appsドメイン/アプリID/Googleアカウントがまったく異なる場合は、エラーを再現できません。

max-resultsを1(100または50または20の代わりに)に変更したとき、断続的に成功しました。しかし、max-resultが1であるため、私は1000回も多くのクエリを実行する必要があります。そして、最大3回連続して成功するため、指数的バックオフが終了するまで私の全結果セットを得ることはありません。結果セット(私が照会するフォルダは300から400までのフォルダで構成されています(これはpdfファイルを含む少なくとも2 - 6のサブフォルダから成ります)

私はmax-result 2で試してみましたが、私がmax-result 1に戻った場合、それは1つまたは2つのフェッチで1つの行に成功しますが、これは十分ではありません。フォルダ構造全体が正しいフォルダを見つけるために必要です。

これは自分のローカル環境から試したものです。つまり、完全に異なるIPアドレスから試しても、それでも失敗します。つまり、アプリケーションエンジンのアプリがGoogleドキュメントにアクセスできないことを意味します。 2から1への変更もそれを証明します。

結論: 私がループしているコレクション内の膨大な量のファイルとコレクションのために、Google Docs APIからのスローリターンが必要です。このコレクションには約3500 MBが含まれています。これは問題ですか?

ログ: DocListUrl = https://docs.google.com/feeds/default/private/full/folder:XXXXXXX/contents?max-results=1からエントリを取得します。

RetryGetDocListを再試行すると、1秒間待機します。
RetryGetDocListを再試行して1秒間待機します。
RetryGetDocListを再試行すると、4秒間待機します。
RetryGetDocListを再試行して、9秒間待機します。
RetryGetDocListを再試行して、16秒間待機します。
RetryGetDocListを再試行して、25秒待ちます。


のApplicationError:5
トレースバック(最新の呼び出しの最後):中 ファイル "/base/python_runtime/python_lib/versions/1/google/appengine/ext/webapp/_webapp25.py"、ライン703、 コールポスト 成功に handler.post(*グループ) ファイル "/base/data/home/apps/XXXX/prod-43.358023265943651014/DocsHandler.py"、ライン418、= uploader.Upload(blob_reader、fileToUpload。 fileToUpload.salesforceLink、fileToUpload.salesforceLink、fileToUpload.Fileder、fileToUpload.type_folder_name、fileToUpload.file_name、currentUser、client、logObj)。 ファイル "/base/data/home/apps/XXXX/prod-43.358023265943651014/DocsClasses.py"、行404、アップロード中 collections = GetAllEntries( 'https://docs.google.com/feeds/default/private/ GetAllEntriesのファイル "/base/data/home/apps/XXXX/prod-43.358023265943651014/DocsClasses.py"、行351 チャンク(フル/%s/contents?max-results = 1 '%(ruleTypeFolderResourceId) = RetryGetDocList(client.GetDocList、chunk.GetNextLink()。HREF)RetryGetDocList 戻り関数呼び出し(URI) で ファイル "/base/data/home/apps/XXX/prod-43.358023265943651014/DocsClasses.py"、ライン202、ファイル "/base/data/home/apps/XXX/prod-43.358023265943651014/gdata/docs/client.py"、行142、get_doclist auth_token = auth_token、** kwargs) ファイル "/ base/data/home /アプリ/XXXX/prod-43.358023265943651014/gdata/client.py "、行635、get_feed ** kwargs) ファイル" /base/data/home/apps/XXXXX/prod-43.358023265943651014/gdata/client.py "、行265、要求中 uri = auth_token = auth_token、http_request = http_request、** kwargs) ファイル "/base/data/home/apps/XXXX/prod-43.358023265943651014/atom/client.py"、117行目リクエスト return self.http_client.request(http_request) ファイル「/base/data/home/apps/XXXXX/prod-43.358023265943651014/atom/http_core.py」、行420、リクエスト中 http_request.headers、http_request._body_parts) ファイル "/base/data/home/apps/XXXXX/prod-43.358023265943651014/atom/http_core.py"、行497、_http_request return connection.getresponse() ファイル "/base/python_runtime/python_dist/lib/python2.5/httplib.py"、行206、getresponse 締め切り= self.timeout) ファイル "/ base/python_runtime/python_lib/versions/1/google/appengine /api/urlfetch.py​​ "、行263、取得時 return rpc.get_result() ファイル「/base/python_runtime/python_lib/versions/1/google/appengine/api/apiproxy_stub_map.py」ファイル592、get_result 自己を返す。ApplicationError:_get_fetch_result 昇給DeadlineExceededError(STR(ERR)) DeadlineExceededErrorで__get_result_hook(自己)

ファイル "/base/python_runtime/python_lib/versions/1/google/appengine/api/urlfetch.py​​"、ライン371、 :GoogleのドキュメントリストAPIから時応答に5

よろしく /イェンス

+0

指数関数的に後退していますか? https://developers.google.com/google-apps/documents-list/#implementing_exponential_backoff –

+0

フェッチ元のユーザーのドキュメントセットのサイズはどのくらいですか?あなたが描いていることは非常にまれです。開発サーバーで再現できますか?別のGmailアカウントで再現できますか? –

+0

useraccountのdoc-settingsからコピーされました - "問い合わせ先のユーザーアカウントは、現在利用可能な205824 MBのうち7000 MB(3%)を使用しています。" dev-envのコードを使用しても、Google Appsドメイン/アプリID/Googleアカウントがまったく異なる場合は、エラーを再現できません。私はdev-envからのプロダクション設定を試してみます。 – user1315063

答えて

2

は、App EngineののHTTP要求の期限を超えています。これは、APIで返されるドキュメントのコーパスが非常に大きい場合に当てはまります。

これを回避するには、max-resultsパラメータを1000より小さい値に設定します。

また、exponential back-offを使用してリクエストを再試行してください。

失敗したアップロードを回避するには、アップロードを完了するためにApp Engineのタスクキューとresumable upload with the APIを使用します。

App Engineチームにリクエストを送信すると、アプリケーションのHTTPタイムアウトのサイズをこのリクエストを成功させるために必要な秒数に増やすことができます。しかし、チームがそのような要請を強力に必要とせずに承認することはまれです。

+0

私は指数バックオフとタスクキューと再開可能アップロードAPIを使用しています。 – user1315063

+0

ログ、URLサンプル、例外の説明の追加を参照してください – user1315063

+0

Google Docs APIの遅い復帰時間は、私がループしているコレクション内の膨大な量のファイルとコレクションのためです。このコレクションには約3500 Mb(約2000〜3000のファイル)が含まれています。 Vic、リクエストのタイムアウトを延長する可能性についてApp Engineチームに問い合わせるにはどうすればよいですか? Vicでは、この量のファイルのためにAPIが遅くなり、遅くなります。 Docs Storage Spaceを200Gb追加したことがありますか? – user1315063