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

Enterprise Distributed Application Service:Spring Cloud アプリケーションをグレースフルシャットダウンする

最終更新日:Jan 07, 2025

グレースフルシャットダウンは、オンラインアプリケーションのコンシューマーには感知されません。アプリケーションの再起動またはシャットダウン中も、コンシューマーは中断なくアプリケーションを継続的に使用できます。デフォルトでは、Enterprise Distributed Application Service (EDAS) は Spring Cloud アプリケーションのグレースフルシャットダウンをサポートしています。Spring Cloud アプリケーションのグレースフルシャットダウンを設定する必要はありません。

背景情報

グレースフルシャットダウンにより、アプリケーションの停止時にコンシューマーのサービスリクエストが想定どおりに処理されることが保証されます。理想的には、サービスリクエストが存在しない場合に、アプリケーションを安全かつ確実に更新できます。ただし、これは実際の運用では非常にまれです。

従来のソリューションは、トラフィックの削除、アプリケーションの停止、アプリケーションの更新、アプリケーションの再起動という手順を手動で実行することです。このソリューションを使用してアプリケーションを更新する場合、クライアントのビジネス継続性は影響を受けません。

革新的なソリューションは、コンテナまたはフレームワークレベルで自動化されたメカニズムを使用することです。このソリューションは、トラフィックを自動的に削除し、受信したすべてのリクエストを処理して、更新プロセスをビジネスに感知させず、更新中の O&M 作業を効率的に行うために使用できます。グレースフルシャットダウンは、このような革新的なソリューションです。

EDAS のグレースフルシャットダウンの利点

オープンソースの Spring Cloud が提供するグレースフルシャットダウンソリューションを使用する場合は、シャットダウンフック、Spring Boot Actuator、および Ribbon を使用する必要があります。このソリューションでは、追加の開発作業が必要になり、短期間でレジストリへのトラフィック損失が発生する可能性があります。

EDAS はグレースフルシャットダウンをリリースプロセスに統合し、アプリケーションの停止、デプロイ、ロールバック、スケールイン、リセット時にグレースフルシャットダウンを自動的に実装します。オープンソースの Spring Cloud のグレースフルシャットダウンと比較して、EDAS のグレースフルシャットダウンには次の利点があります。

カテゴリ

オープンソース Spring Cloud

EDAS

バージョン

ServiceRegistryEndpoint を呼び出すときは、Spring Boot Actuator を使用し、使用中の Spring Cloud バージョンと互換性のあるバージョンに更新する必要があります。

EDAS は Spring Cloud Dalston 以降をサポートしています。追加の操作を実行する必要はありません。

サービスレジストリとトラフィック損失

オープンソースの Spring Cloud は、トラフィック損失を引き起こす可能性のあるレジストリに依存します。

  • ZooKeeper レジストリを使用する場合、トラフィック損失は発生しません。

  • Eureka レジストリを使用する場合、トラフィック損失は 3 秒間続きます。

  • Nacos レジストリを使用する場合、クライアントのキャッシュが原因で、トラフィック損失は最大 10 秒間続きます。

EDAS はレジストリに依存しません。トラフィック損失は発生しません。

シナリオ

  • Elastic Compute Service (ECS) クラスタにデプロイされているアプリケーションをグレースフルシャットダウンする場合は、アプリケーションの変更の詳細を表示する必要があります。

  • Kubernetes クラスタにデプロイされているアプリケーションをグレースフルシャットダウンする場合は、prestop を呼び出す必要があります。ただし、prestop に対して設定できるアクションは 1 つだけです。

EDAS コンソールで、ECS クラスタと Kubernetes クラスタにデプロイされているアプリケーションをグレースフルシャットダウンできます。アプリケーションの操作と設定は影響を受けません。

クライアントキャッシュ

クライアントのキャッシュを更新するために、Ribbon に適切な時間範囲を設定する必要があります。時間範囲が長すぎると、アプリケーションをグレースフルシャットダウンしたときにトラフィック損失が発生します。時間範囲が短すぎると、サービスのパフォーマンスが低下します。

アプリケーションをグレースフルシャットダウンすると、EDAS はクライアントのキャッシュを更新するための拡張メカニズムを Ribbon に提供します。EDAS は、リアクティブレスポンスメソッドに基づいてキャッシュを自動的に更新します。これにより、キャッシュを更新する必要がなくなります。

グレースフルシャットダウンが有効になっているかを確認する

ビジネス要件に基づいて、アプリケーションでグレースフルシャットダウンが有効になっているかを確認できます。EDAS は、Provider と Consumer というアプリケーションデモを提供しています。Container Service for Kubernetes (ACK) クラスタでアプリケーションデモを使用して、グレースフルシャットダウンが有効になっているかを確認できます。

手順

  1. [Provider] アプリケーションデモと [Consumer] アプリケーションデモをダウンロードします。

  2. ACK クラスタに Provider と Consumer をデプロイします。

    Provider には 2 つのインスタンスがデプロイされ、Consumer には 1 つのインスタンスがデプロイされます。アプリケーションデモのデプロイ方法の詳細については、「概要」をご参照ください。

  3. Consumer から Provider に開始された呼び出しのステータスを表示します。

    1. Consumer がデプロイされているポッドにログオンし、次のコマンドを実行して Provider のサービスに継続的にアクセスします。

      #!/usr/bin/env bash
      while true
      do
          echo `curl -s -XGET http://localhost:18091/user/rest`
      done
    2. 呼び出しのレスポンスを表示します。

      Image - Successful call responses

      上記のレスポンスは、Consumer が Provider の 2 つのインスタンスにランダムにアクセスしていることを示しています。インスタンスの IP アドレスは 172.20.0.221 と 172.20.0.223 です。

      重要

      レスポンスウィンドウを閉じないでください。

  4. Provider から 1 つのインスタンスをスケールインし、インスタンスを再起動します。詳細については、「Kubernetes クラスタのアプリケーションライフサイクル管理」をご参照ください。

  5. 呼び出しのレスポンスをもう一度表示して、グレースフルシャットダウンが有効になっているかを確認します。

    Image - Call responses - Graceful shutdown

    Consumer の呼び出しステータスを表示して、グレースフルシャットダウンが有効になっているかを確認します。Consumer のログを表示します。ログに例外が発生していないことが示されている場合、インスタンスの可用性がないことは Consumer には感知されません。

    上記のレスポンスは、Consumer が Provider の残りのインスタンスにのみアクセスしていることを示しています。インスタンスの IP アドレスは 172.20.0.221 です。アクセスプロセスでは、呼び出しの例外は発生せず、Consumer は影響を受けません。