1

Restfulインターフェースと通信したいアプリエンジンアプリケーションのインスタンスが2つあります。一方のデータが更新されると、もう一方のWebフックが呼び出され、独自のシステムのデータの新しいコピーが取得されます。'site1'の中に私は持っています:

 from google.appengine.api import urlfetch

 url = www.site2.com/data_updated
 result = urlfetch.fetch(url)

'site2'のdata_updatedのハンドラー内には次のものがあります。

 url = www.site1.com/get_new_data
 result = urlfetch.fetch(url)

2つのサイト間で受け渡されるデータはほとんどありませんが、次のエラーが発生します。期限を10秒に延長しようとしましたが、それでも機能しません。

 DeadlineExceededError: ApplicationError: 5 

誰かが何が起こっているのかについての洞察を提供できますか?

ありがとう-リチャード

4

5 に答える 5

3

App Engineurlfetchは常に期待どおりに動作するとは限りません。URLを取得するには、約10秒かかります。DeadlineExceededErrorフェッチしようとしているURLが稼働していると仮定すると、を呼び出しfrom google.appengine.runtime import apiproxy_errorsてから、を使用してtry/exceptブロック内でurlfetch呼び出しをラップすることでをキャッチできるはずですexcept apiproxy_errors.DeadlineExceededError:

ここに関連する答え。

于 2011-06-18T11:13:13.160 に答える
3

メソッドをから変更する

  result = urlfetch.fetch(url)

  result = urlfetch(url,deadline=2,method=urlfetch.POST)

Deadlineエラーを修正しました。

urlfetchのドキュメントから:

deadline リモートホストからの応答を待機する最大時間(秒数)。リモートホストがこの時間内に応答しない場合、DownloadErrorが発生します。

リクエストの待機に費やされた時間は、リクエストのCPUクォータにはカウントされません。リクエストタイマーにカウントされます。URL Fetch呼び出しが戻る前にアプリ要求タイマーが期限切れになると、呼び出しはキャンセルされます。

期限は、リクエストハンドラーの場合は最大60秒、タスクキューとcronジョブハンドラーの場合は最大10分です。期限がNoneの場合、期限は5秒に設定されます。

于 2011-06-18T12:38:09.920 に答える
1

URL(www.site2.com/data_updatedおよびwww.site1.com/get_new_data)を手動でクエリしcurlたり、制限時間内に応答していることを確認したりしましたか?転送する必要のあるデータの量が少ない場合でも、ハンドラーに問題があり、結果の返送に遅延が発生している可能性があります。

于 2011-06-17T18:25:58.017 に答える
1

ここでは、転送されるデータの量は問題ではなく、遅延が問題になります。

話しているアプリが応答するのに10秒以上かかることが多い場合は、別のクラウドプラットフォーム(EC2など)で「プロキシコールバック」サーバーを使用する必要があります。しばらく待つことができる場合は、新しいバックエンドインスタンスはurlfetchの時間制限をいくらか緩和することになっています。

平均応答時間が10秒未満で、失敗しているのが比較的少ない場合は、数回再試行してください。あなたのために、呼び出しがべき等であることを願っています(つまり、再試行が悪影響を及ぼさないようにするため)。そうでなければ、あなたはあなた自身のレイヤーを上に転がすことができるかもしれません-それは少し苦痛ですが、それはうまくいきます、それは私たちがしていることです。

J

于 2011-06-18T00:06:02.027 に答える
1

GAEのドキュメントには、期限は60秒になる可能性があると記載されています。

result = urlfetch(url,deadline=60,method=urlfetch.POST)
于 2011-11-03T20:56:23.480 に答える