0

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

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

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

Please try again in 30 seconds.

ログに、次のメッセージを含むバックエンドの/ _ah / startへのリクエスト(これに対する特定のハンドラーはありません)が表示されます。

 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です。これをアップグレードできるとしましょう。しかし、資金不足のスタートアップなので、私はむしろアップグレードしたくありません。

4

2 に答える 2

3

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

最初のcron呼び出しをより堅牢にするために、1つの特定のバックエンドタスクに対してcron要求を数回行うことができます。タスクを配置するときに、特定のタスクに関連付けられた名前(たとえば、20120430-task1など)でタスクに名前を付け、タスクのエラーをキャッチします。複製(そして、ロギングを除いて、catch句では何もしません)。

名前付きタスクの詳細については、 https ://developers.google.com/appengine/docs/java/taskqueue/overview#Task_Namesをご覧ください。

于 2012-04-29T12:58:37.887 に答える
0

バックエンドがオンラインで準備ができていることを確認するために私が使用した便利なトリックは、do-workcronの30秒前に何もしないcronをスケジュールすることです。no-opリクエストが失敗したか成功したかは関係ありません。重要なcronの前に、バックエンドをウォームアップします。

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

于 2012-04-29T18:06:41.580 に答える