コンテンツにスキップ

ウォームアップ機能

概要

ウォームアップは、プリザンターの起動直後に必要な初期化処理をあらかじめ実行しておく機能です。

ASP.NET Coreで動作するアプリケーションは、起動した直後の状態では、テナントやサイト設定の読み込み、データベース接続の確立、実行コードのコンパイルといった処理が完了していません。これらは本来、最初のリクエストを受け取ったときに初めて実行されるため、その最初のユーザだけがレスポンスの遅延を体感します。ウォームアップ機能は、これらの初期化処理をアプリケーションの起動時にまとめて実行し、初回リクエストのレスポンス遅延をなくします。

プリザンターのウォームアップには、次の2つの特徴があります。

  1. 初期化が完了するまで、通常のリクエストをブロックし、ウォームアップ中である旨をユーザへ返却します。これにより、初期化が済んでいない不完全な状態でのアクセスを防ぎます。
  2. ウォームアップの状況は、「ヘルスチェック機能」のエンドポイント(/healthz)から確認できます。ロードバランサやコンテナ基盤は、この状況を参照することで、ウォームアップが完了したインスタンスにのみトラフィックを振り向けられます。

前提条件

  1. ウォームアップが失敗またはタイムアウトした場合、プリザンターは「BackgroundService.json」のパラメータWarmupFailureShutdownDelaySecondsで指定した時間だけ待機したのち、終了します。終了後の再起動は、IIS、サービス管理、コンテナ基盤など、実行環境側の動作に従います。待機中、通常のリクエストは引き続きブロックされ、503 Service Unavailableを返却します。
  2. ウォームアップが失敗した場合、その原因となった例外はシステムログに記録されます。実行環境が自動でインスタンスを再起動する構成では、原因が解消されない限り、起動と失敗が繰り返される場合があります。データベースへの接続失敗など、原因を確認したうえで対処してください。
  3. ウォームアップは各インスタンスが独立して実行します。複数インスタンスをクラスタ構成で運用する場合、すべてのインスタンスでウォームアップが完了するまで、全体としては初期化中のインスタンスが残り得ます。

ウォームアップの流れ

ウォームアップは、プリザンターの起動と同時にバックグラウンドで自動的に開始されます。ユーザによる操作や設定は不要です。

ウォームアップは、次の3つの状態を順に辿ります。

正常系の状態

状態 説明
未開始(NotStarted) プリザンターは起動したが、ウォームアップがまだ始まっていない状態です。
進行中(InProgress) 初期化処理を実行している状態です。テナント、ユーザ、アイテム、ステータス、サイト設定などを順に初期化します。
完了(Completed) すべての初期化処理が正常に完了し、通常のリクエストを受け付けられる状態です。

異常系の状態

正常でない状態を規定する3つの状態が定義されています。

状態 説明
失敗(Failed) 初期化処理の途中で例外が発生した状態です。
タイムアウト(TimedOut) 規定の時間内にウォームアップが完了しなかった状態です。
キャンセル(Canceled) 初期化処理が中断された状態です。

これらの「異常系」の状態については、前提条件の1.、前提条件の2.、および以下の「ウォームアップの動作設定」を参照してください。

ウォームアップの動作設定

ウォームアップのタイムアウト時間と、失敗時にプリザンターを終了するまでの待機時間は、「BackgroundService.json」のパラメータで設定できます。

BackgroundService.json
{
        :省略
    "WarmupTimeoutSeconds": 180,
    "WarmupFailureShutdownDelaySeconds": 60
}

各パラメータの詳細は「BackgroundService.json」を参照してください。

ウォームアップ中の動作

ウォームアップが完了するまでの間、プリザンターは通常のリクエストを受け付けず、代わりにウォームアップ中である旨を返却します。返却される内容は、リクエストの種類によって異なります。

リクエストの種類 プリザンターの応答
通常のページリクエスト エラーページ(/errors/warmup)へリダイレクトし、「サービスを利用できません」を表示します。最終的なHTTPステータスコードは503 Service Unavailableです。
Ajaxリクエスト 503 Service Unavailableとともに、JSON形式のエラーレスポンスを返却します。
IIS Application Initializationからのリクエスト 即座に応答を返さず、ウォームアップの完了を待機します。完了後、成功していれば200 OKを、それ以外であれば503 Service Unavailableをそれぞれ返却します。

IIS Application Initializationからのリクエストは、User-Agentヘッダの値によって判別します。後述の「IIS」の設定でIISから送信される初期化リクエストは、この経路で処理されます。

ただし、以下のパスへのリクエストは、ウォームアップ中でもブロックされずに処理されます。

  1. ヘルスチェック機能のエンドポイント(/healthz)
  2. 静的リソース(/css、/js、/lib)
  3. エラーページ(/errors)

/healthzが処理されることで、ウォームアップ中でも後述の状態確認を行えます。静的リソースが返却されることで、エラーページが正しく表示されます。

ウォームアップの状態を確認する

ウォームアップの状況は、「ヘルスチェック機能」のレスポンスに含まれるwarmupエントリで確認できます。このエントリをレスポンスへ含めるためには「詳細なレスポンス」を有効化する必要があります。ヘルスチェック機能の詳細と、詳細なレスポンスの有効化については、「ヘルスチェック機能」を参照してください。

warmupエントリのstatusとdescriptionの組み合わせにより、ウォームアップの状況を把握できます。

statusの値 descriptionの値 ウォームアップの状況
Healthy Warmup completed 正常完了
Degraded Warmup not started 未開始
Degraded Warmup in progress 進行中
Unhealthy Warmup failed 失敗
Unhealthy Warmup timed out タイムアウト
Unhealthy Warmup canceled キャンセル

/healthz全体のHTTPステータスコードは、ウォームアップの状況に応じて次のようになります。

statusの値 HTTPステータスコード
Healthy 200 OK
Degraded 503 Service Unavailable
Unhealthy 503 Service Unavailable

ウォームアップが完了する(Healthy)まで、/healthzは503 Service Unavailableを返します。そのため、ロードバランサやコンテナ基盤の監視をこのエンドポイントに向けるだけで、ウォームアップが完了していないインスタンスにトラフィックが振り向けられることを防げます。

ロードバランサ・コンテナ環境での運用

複数インスタンスを運用する環境では、ウォームアップ中のインスタンスにトラフィックを振り向けないよう設定することで、ユーザがウォームアップ中のエラーページを目にすること自体を避けられます。

各基盤では、/healthzを監視対象に指定し、ウォームアップ完了後にインスタンスをサービス対象へ組み込むよう設定してください。各基盤の設定項目の詳細は、それぞれの公式ドキュメントを参照してください。

対応バージョン

対応バージョン 内容
1.5.7.0 以降 ウォームアップ機能を追加