2012-04-29 4 views
0

2つの異なる動的バックエンドに2つのcronジョブがあり、どちらも同じ問題を抱えています。私はcronジョブがブラウザで直接実行するURLに移動することで問題を再現できます。AppEngineバックエンドが503を返す - Java

私たちのアプリはかなり高いコールドスタート時間を持っています。私はバックエンドを使用してURLに移動すると、私はログに次のエラー

Error: Server Error 
The service you requested is not available yet. 

Please try again in 30 seconds. 

を参照してください、私は/ _ah /バックエンドのために(私たちは、このための具体的なハンドラを持たない)を開始するための要求を参照してください

This request caused a new process to be started for your application, and thus caused your application code to be loaded for the first time. This request may thus take longer and use more CPU than a typical request for your application. 

次に、バックエンドURLをリフレッシュして正常に動作しました。

私の理論では、バックエンドが既にロードされていれば、cronジョブが正常に動作するということです。そうでない場合は、バックエンドに負荷がかかるかどうかを確認するのに十分長く待たないでください。

と仮定すると、/ _ah/startが終了するまでcronジョブを待機させる方法はありますか?

これ以外の2つのオプションは、私たちがやりたいと思わない常駐インスタンスを使用することです。または、ToDoリストにある私たちのコールドスタートアップ時間を改善することですフロントエンドのインスタンス)。

バックエンドはB1です。私たちはこれをアップグレードすることができたとしますが、現金を抱えたスタートアップであっても、私はむしろそれをやりたいと思います。

答えて

3

Cronにはタスクキューが持つ再試行機能がありません。したがって、動的バックエンドインスタンスを使用してタスクキューにタスクを配置するには、フロントエンドcronを使用することをお勧めします。そうすれば、cronリクエスト自体は、あなたが今やっていることよりも信頼性の高い空いているフロントエンドインスタンスによって処理され、失敗時にバックエンドタスクの実行が再試行されます。

最初のcronコールをよりロバストにするために、ある特定のバックエンドタスクに対して何回かcron要求を行い、タスクを実行するときにタスクに特定のタスク(たとえば20120430-task1など)タスクの重複のエラーをキャッチします(ロギング以外のcatch節では何も行いません)。名前のタスクの詳細については

は、以下を参照してください。 https://developers.google.com/appengine/docs/java/taskqueue/overview#Task_Names

+0

私はあなたが最初の段落で説明したものとまったく同じ結果を出しました。動作が始まったら、cronコールをより堅牢にすることについて提案します。 –

0

を私はバックエンドを確保するために使用してきました便利なトリックがオンラインで行く準備ができていることは30秒ご行う前に、何も行わないのcronをスケジュールすることです-work cron。 no-opリクエストが失敗するか、成功するかどうかは関係ありません。重要なcronの前にバックエンドを温めます。

エラーコード503に関する別の注意 - これは、存在しないバックエンドインスタンス番号に対処する場合に発生することがあります。バックエンドホストが0.ybackback.yourapp.appspot.comであること、または#が<でバックエンドが割り当てられていることを確認するには、タスクヘッダーを確認してください。

関連する問題