グレースフルシャットダウンは、オンラインアプリケーションのコンシューマーには感知されません。アプリケーションの再起動またはシャットダウン中も、コンシューマーは中断なくアプリケーションを継続的に使用できます。デフォルトでは、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 は、トラフィック損失を引き起こす可能性のあるレジストリに依存します。
| EDAS はレジストリに依存しません。トラフィック損失は発生しません。 |
シナリオ |
| EDAS コンソールで、ECS クラスタと Kubernetes クラスタにデプロイされているアプリケーションをグレースフルシャットダウンできます。アプリケーションの操作と設定は影響を受けません。 |
クライアントキャッシュ | クライアントのキャッシュを更新するために、Ribbon に適切な時間範囲を設定する必要があります。時間範囲が長すぎると、アプリケーションをグレースフルシャットダウンしたときにトラフィック損失が発生します。時間範囲が短すぎると、サービスのパフォーマンスが低下します。 | アプリケーションをグレースフルシャットダウンすると、EDAS はクライアントのキャッシュを更新するための拡張メカニズムを Ribbon に提供します。EDAS は、リアクティブレスポンスメソッドに基づいてキャッシュを自動的に更新します。これにより、キャッシュを更新する必要がなくなります。 |
グレースフルシャットダウンが有効になっているかを確認する
ビジネス要件に基づいて、アプリケーションでグレースフルシャットダウンが有効になっているかを確認できます。EDAS は、Provider と Consumer というアプリケーションデモを提供しています。Container Service for Kubernetes (ACK) クラスタでアプリケーションデモを使用して、グレースフルシャットダウンが有効になっているかを確認できます。
手順
[Provider] アプリケーションデモと [Consumer] アプリケーションデモをダウンロードします。
ACK クラスタに Provider と Consumer をデプロイします。
Provider には 2 つのインスタンスがデプロイされ、Consumer には 1 つのインスタンスがデプロイされます。アプリケーションデモのデプロイ方法の詳細については、「概要」をご参照ください。
Consumer から Provider に開始された呼び出しのステータスを表示します。
Consumer がデプロイされているポッドにログオンし、次のコマンドを実行して Provider のサービスに継続的にアクセスします。
#!/usr/bin/env bash while true do echo `curl -s -XGET http://localhost:18091/user/rest` done
呼び出しのレスポンスを表示します。
上記のレスポンスは、Consumer が Provider の 2 つのインスタンスにランダムにアクセスしていることを示しています。インスタンスの IP アドレスは 172.20.0.221 と 172.20.0.223 です。
重要レスポンスウィンドウを閉じないでください。
Provider から 1 つのインスタンスをスケールインし、インスタンスを再起動します。詳細については、「Kubernetes クラスタのアプリケーションライフサイクル管理」をご参照ください。
呼び出しのレスポンスをもう一度表示して、グレースフルシャットダウンが有効になっているかを確認します。
Consumer の呼び出しステータスを表示して、グレースフルシャットダウンが有効になっているかを確認します。Consumer のログを表示します。ログに例外が発生していないことが示されている場合、インスタンスの可用性がないことは Consumer には感知されません。
上記のレスポンスは、Consumer が Provider の残りのインスタンスにのみアクセスしていることを示しています。インスタンスの IP アドレスは 172.20.0.221 です。アクセスプロセスでは、呼び出しの例外は発生せず、Consumer は影響を受けません。