すべてのプロダクト
Search
ドキュメントセンター

Microservices Engine:グレースフルシャットダウン

最終更新日:Jun 05, 2025

オンライン アプリケーションを更新する場合は、アプリケーションの停止と再起動の期間中にサービスの継続性を確保する必要があります。アプリケーションをデプロイ、停止、ロールバック、スケールイン、またはリセットする場合、マイクロサービスエンジン (MSE) マイクロサービスガバナンスが提供するグレースフルシャットダウン機能を構成して、ビジネスに影響を与えることなくアプリケーションがシャットダウンされるようにすることができます。このトピックでは、グレースフルシャットダウン機能の使用方法と利点、および MSE コンソールでこの機能を使用する方法について説明します。

背景情報

プロバイダーとして機能するアプリケーション インスタンスが高同時実行シナリオで直接シャットダウンされた場合、コンシューマーとして機能するアプリケーション インスタンスは、マイクロサービス アプリケーションの呼び出し特性により、ダウンストリーム プロバイダーのステータスをリアルタイムで認識できません。コンシューマーは、シャットダウンされたプロバイダーにリクエストを転送し続けます。その結果、リクエスト エラーが報告され、トラフィック損失が発生します。

グレースフルシャットダウンの仕組み

プロバイダー A がシャットダウンされると、マイクロサービスレジストリにシャットダウン イベントが通知されます。ただし、コンシューマー B はシャットダウン イベントをリアルタイムで認識しない場合があります。その結果、コンシューマー B は、プロバイダー A がシャットダウンされた後も、プロバイダー A を呼び出し続けます。この問題を解決するために、グレースフルシャットダウン機能が導入されています。プロバイダー A は、シャットダウン コマンドを受信した後、シャットダウンされるまで待機し、待機期間中に受信したリクエストへの応答に特別なタグを追加します。コンシューマー B は、特別なタグが追加された応答を受信した後、マイクロサービスレジストリからアプリケーション インスタンス情報をプロアクティブに取得します。これにより、コンシューマー B はプロバイダー A のステータスをリアルタイムで認識し、プロバイダー A のシャットダウンを認識できます。また、プロバイダー A は一定期間待機して、転送中のすべてのリクエストがシャットダウン前に実行されるようにします。

説明

アプリケーションに対して MSE マイクロサービスガバナンスが有効になっている場合、グレースフルシャットダウン機能は、アプリケーションに対して自動的に有効になります。ただし、グレースフルシャットダウンのプロアクティブ通知機能を使用する場合は、グレースフルシャットダウンに対してこの機能を手動で有効にする必要があります。 MSE のグレースフルスタートおよびシャットダウン機能は、アプリケーションがグレースフルにシャットダウンされたかどうかを判断するのに役立つ可観測性も提供します。

Kubernetes クラスタ内のアプリケーションに対して MSE マイクロサービスガバナンスによって提供されるグレースフルシャットダウンが有効になっている場合、lifecycle.preStop が関連付けられたポッドに挿入され、ポッドが終了する前にグレースフルシャットダウンが実装されます。したがって、カスタム preStop フックを構成しないことをお勧めします。カスタム preStop フックを使用してマイクロサービスレジストリからアプリケーションを登録解除する場合、カスタムフックの関連ロジックを完全に削除できます。代わりに、グレースフルシャットダウン用に自動的に挿入される preStop フックを直接使用できます。

いくつかのグレースフルシャットダウン操作を実行する必要があり、ビジネス コンテナー用にカスタム preStop フックが構成されている場合、グレースフルシャットダウンの preStop フックはビジネス コンテナーに挿入されなくなります。代わりに、gracefulshutdown という名前のサイドカー コンテナーが挿入され、グレースフルシャットダウンの preStop フックがサイドカー コンテナーに挿入されます。デフォルトでは、サイドカー コンテナーはビジネス コンテナーとネットワーク名前空間を共有します。ポッドが終了する前に、サイドカー コンテナーの preStop フックを使用して、ビジネス コンテナーのグレースフルシャットダウンを実装することもできます。

サイドカー コンテナーの preStop フックが正常に実行されるようにするには、ビジネス コンテナーのカスタム preStop フックに少なくとも 30 秒のスリープ期間を指定する必要があります。これにより、転送中のリクエストが完全に処理されます。

説明
  • リソース消費が少ないため、各サイドカー コンテナーは 0.05 CPU コアと 50 MiB のメモリの構成を採用しています。

  • Kubernetes シナリオでは、グレースフルシャットダウンは preStop フックに基づいて実装されます。現在、グレースフルシャットダウンは、スケールイン、再起動、ローリングアップグレードなど、ポッドが正常に停止されるシナリオでのみサポートされています。 OOM kill など、ポッドが異常に停止されたシナリオでは、グレースフルシャットダウンはサポートされていません。

グレースフルシャットダウンを有効にする

  • アプリケーションが Alibaba Cloud Container Service for Kubernetes (ACK) クラスタにデプロイされている場合、アプリケーションに対して MSE マイクロサービスガバナンスを有効にすると、グレースフルシャットダウンが自動的に有効になります。それ以上の操作は必要ありません。

  • アプリケーションが Alibaba Cloud Elastic Compute Service (ECS) インスタンスにデプロイされている場合は、次のコマンドをアプリケーションのシャットダウンスクリプトに追加し、スクリプトの実行中に優先的にコマンドを実行する必要があります。

    curl http://127.0.0.1:54199/offline 2>/tmp/null; sleep 30; // アプリケーションをオフラインにするリクエストを送信し、30秒待機します

グレースフルシャットダウンを観察する

アプリケーションに対してグレースフルシャットダウン機能が有効になっていて、アプリケーションがシャットダウンされた場合、アプリケーションのトラフィックが短期間で利用できなくなり、アプリケーション ガバナンス ページでクエリ/秒 (QPS) 値がゼロに低下することを観察できます。

  1. MSE コンソール にログインし、上部のナビゲーションバーでリージョンを選択します。

  2. 左側のナビゲーションウィンドウで、[マイクロサービスガバナンス] > [アプリケーションガバナンス] を選択します。表示されるページで、管理するアプリケーションのリソースカードをクリックします。

  3. アプリケーション詳細ページで、左側のナビゲーションウィンドウの [トラフィック管理] をクリックし、[グレースフルスタート/シャットダウン] タブをクリックします。

[スタートとシャットダウンの概要] サブタブで、最近発生したアプリケーションのグレースフルスタートとシャットダウン プロセス中に発生したイベントを表示できます。左側のウィンドウで、観察するアプリケーションを見つけてクリックします。右側のウィンドウの視覚情報は、アプリケーションがグレースフルシャットダウン プロセスを実行し、プロセスが完了するとトラフィックがすぐにゼロに低下することを示しています。アプリケーションが停止する前に、アプリケーションにトラフィックは流れません。

image

重要
  • シャットダウン イベントが正常に発生した後、QPS データがすぐにゼロに低下しない場合は、ローカルコールなど、トラフィックを消費する可能性のあるマイクロサービス以外のリクエスト コールがないか確認してください。

  • アプリケーションのシャットダウン イベントは、使用中のエージェントのバージョンが 4.2.0 以降の場合にのみ報告されます。このイベントが観察されない場合は、エージェントのバージョンをアップグレードできます。

プロアクティブ通知機能を有効にする

定義

プロアクティブ通知機能は、グレースフルシャットダウンによって提供される高度な機能です。デフォルトでは、プロアクティブ通知機能は無効になっています。ほとんどのシナリオで MSE が提供するグレースフルシャットダウン機能を使用して問題を解決できます。ただし、シャットダウンされるアプリケーションが Spring Cloud フレームワークを使用している場合、コンシューマー コール エラーが発生する可能性があります。この場合、プロアクティブ通知機能を有効にできます。プロアクティブ通知機能が有効になると、プロバイダーはシャットダウン フェーズ中にコンシューマーにプロアクティブに通知します。通知を受信した後、コンシューマーはプロバイダーにリクエストを転送しなくなります。

前提条件

使用方法

マイクロサービスガバナンスは、次のアプリケーションのグレースフルシャットダウンをサポートしていません。

  • Java 以外のアプリケーション。

  • WebFlux 以外のアプリケーションまたは Spring MVC 以外のアプリケーション。

  • コンシューマー アプリケーションがマイクロサービス アプリケーションではないダウンストリーム プロバイダー アプリケーション。

  • マイクロサービスガバナンスが無効になっているコンシューマー アプリケーションとプロバイダー アプリケーション。

説明

グレースフルシャットダウン機能では、アプリケーションがシャットダウンされる前に、転送中のすべてのリクエストを実行するために特定の時間がかかります。 ACK コンソールで、terminationGracePeriodSeconds パラメーターを 30 より大きい値に設定する必要があります。このパラメーターを 90 に設定することをお勧めします。このパラメーターのデフォルト値は 30 です。デフォルト値 30 を使用すると、アプリケーションの shutdown hook が実行に失敗する可能性があります。その結果、アプリケーションがシャットダウンされるときに特定のリソースが解放されません。

グレースフルシャットダウンのプロアクティブ通知を有効にする

  1. MSE コンソール にログインし、上部のナビゲーションバーでリージョンを選択します。

  2. 左側のナビゲーションウィンドウで、[マイクロサービスガバナンス] > [アプリケーションガバナンス] を選択します。表示されるページで、管理するアプリケーションのリソースカードをクリックします。

  3. アプリケーション詳細ページで、左側のナビゲーションウィンドウの [トラフィック管理] をクリックし、[グレースフルスタート/シャットダウン] タブをクリックします。

  4. [設定] セクションで、[修正] をクリックします。 [グレースフルスタートとシャットダウンの設定] パネルで、[グレースフルシャットダウン] ブロックを展開し、[プロアクティブ通知] スイッチをオンにして、[OK] をクリックします。

関連項目