デプロイメント、スケーリング、再起動は、オンラインアプリケーションにとって日常的な操作です。Microservices Engine (MSE) のグレースフル起動機能は、遅延サービス登録、低トラフィックウォームアップ、およびサービス readiness プローブの 3 つの機能を通じて、アプリケーション起動時の各段階で保護を提供します。
機能概要
遅延登録
マイクロサービスプロバイダーインスタンスは、アプリケーション起動時にレジストリに自身を登録します。登録が完了すると、コンシューマーアプリケーションがそのプロバイダーをサブスクライブして呼び出すことができます。Spring フレームワーク上で構築された Java アプリケーションの場合、通常は Spring コンテキストのリフレッシュ後に登録が行われます。ただし、アプリケーションにまだ完了していない非同期初期化タスクがある場合、即時登録を行うとリクエストエラーが発生する可能性があります。たとえば、MaxCompute アプリケーションはリクエストを処理できるようになる前に、Object Storage Service (OSS) から数百メガバイトのデータをプルする必要があるかもしれません。起動直後に登録されると、リソースが準備されていないため、流入するトラフィックが失敗します。遅延サービス登録機能を使用すると、サービス登録を遅延させる期間を設定でき、アプリケーションが完全に初期化されるまでトラフィックを処理しないように保証できます。
低トラフィックウォームアップ
新しく起動したインスタンスは、多くの場合「コールド状態」にあり、接続プールのレイジー読み込み、キャッシュの事前ウォームアップ、ホットスポットコードのジャストインタイム (JIT) コンパイルなどを実行する必要があります。そのため、この状態でのリクエスト処理能力は、長時間実行されているインスタンスと比べて大幅に低下します。最悪のシナリオでは、サービスが一部停止し、大量のリクエストタイムアウトやエラーが発生する可能性があります。
以下の例は、インスタンスに対する 2 つのリクエストの応答時間の違いを示しています。1 つはリソースが完全に読み込まれる前、もう 1 つは読み込み後のものです。インスタンスがまだリソースを読み込んでいる間に大量のリクエストが到着すると、すべてのリクエストがブロックされる可能性があります。
[arthas@37035]$ trace com.alibaba.mse.consumer.TestController eurekaRest -n 5 \
--skipJDKMethod false
Press Q or Ctrl+C to abort.
Affect(class count: 1 , method count: 1) cost in 105 ms, listenerId: 1
`---ts=2022-02-14 21:28:02;thread_name=http-nio-18099-exec-1;id=39;is_daemon=true;priority=5;TCCL=org.springframework.boot.web.embedded.tomcat.TomcatEmbeddedWebappClassLoader@60e5272
`---[464.275852ms] com.alibaba.mse.consumer.TestController:eurekaRest()
`---[464.018509ms] org.springframework.web.client.RestTemplate:getForObject() #50
`---ts=2022-02-14 21:28:08;thread_name=http-nio-18099-exec-3;id=3b;is_daemon=true;priority=5;TCCL=org.springframework.boot.web.embedded.tomcat.TomcatEmbeddedWebappClassLoader@60e5272
`---[8.46028ms] com.alibaba.mse.consumer.TestController:eurekaRest()
`---[8.402525ms] org.springframework.web.client.RestTemplate:getForObject() #50
低トラフィックウォームアップは、コンシューマーアプリケーション からのトラフィックを新規サービスインスタンスへの 起動時 に制御し、コールドスタートによるパフォーマンス劣化を防ぎ、急激なトラフィックスパイクからインスタンスを保護します。トラフィックは時間とともに徐々に増加し、設定された ウォームアップ持続時間 に達すると、インスタンスは通常通りのトラフィックを受信します。
低トラフィックウォームアップは、オンラインコンシューマーからのトラフィックを使用します。このため、サービスのコンシューマーも MSE Microservices Governance に接続されている必要があります。この機能の動作詳細については、「低トラフィックウォームアップの仕組み」をご参照ください。
サービス readiness プローブ
Kubernetes には readiness プローブ という仕組みがあります。デプロイメント中、新しいインスタンスが readiness プローブに合格すると、古いインスタンスが終了されます(正確な動作はデプロイ戦略により異なります)。しかし、Kubernetes はポートが開いている時点でアプリケーションを ready と判断するため、マイクロサービスが実際に初期化を完了したかどうかを判断できません。これにより、サービスがレジストリへの登録を完了する前に Kubernetes がサービスを ready とマークし、古いインスタンスを終了させてしまう可能性があります。その結果、コンシューマー側で service no provider/instance エラーが発生します。
サービス readiness プローブは、エージェント経由でアプリケーションの登録完了状況を確認する非侵入型 HTTP エンドポイントを提供します。登録が完了していない間は 500 状態コードを返し、登録が成功すると 200 を返します。Kubernetes の readiness プローブをこのエンドポイントを使用するように構成することで、デプロイメント中に常に利用可能なプロバイダーがコンシューマー側に存在することを保証し、「プロバイダーなし」エラーを防止できます。
グレースフル起動の使用
前提条件
注意事項
-
グレースフル起動は、現在、サービス検出にマイクロサービスタイプのレジストリ(Nacos など)を使用するインスタンスに対してのみサポートされています。Kubernetes Services をサービス検出に使用するマイクロサービスインスタンスではサポートされていません。
-
Spring Cloud アプリケーションの場合、低トラフィックウォームアップは Nacos、ZooKeeper、または Eureka をレジストリとして使用するアプリケーションでのみサポートされています。
-
Spring Cloud 向けの低トラフィックウォームアップ機能は、デフォルトの Spring Cloud ロードバランサー(
ZoneAwareLoadBalancer、RoundRobinLoadBalancer、またはRandomLoadBalancer)に基づいて実装されています。アプリケーションのロードバランサー構成を変更した場合、この機能は動作しません。 -
低トラフィックウォームアップを機能させるには、プロバイダーおよびコンシューマーアプリケーションの両方が MSE Microservices Governance に接続されている必要があります。この機能は、公開 API を通じて直接外部トラフィックを受信するゲートウェイなどのアプリケーションには適用されません。
操作手順
ステップ 1:グレースフル起動を有効化する
MSE コンソール にログインし、上部ナビゲーションバーでリージョンを選択します。
左側ナビゲーションウィンドウで、 を選択します。表示されたページで、管理対象のアプリケーションのリソースカードをクリックします。
アプリケーション詳細ページで、左側ナビゲーションウィンドウの Traffic management をクリックし、Graceful Start/Shutdown タブをクリックします。
-
Configuration Information セクションで、**Edit** をクリックし、Graceful Start トグルを有効にしてから、OK をクリックします。
ステップ 2:Kubernetes readiness プローブを構成する
ACK コンソール にログインします。左側ナビゲーションウィンドウで、クラスターリスト をクリックします。
-
Clusters ページで、対象のクラスターをクリックします。左側ナビゲーションウィンドウで、Workload > Stateless を選択します。デプロイ済みのアプリケーションを見つけ、Edit を Actions 列でクリックします。Health Check セクションで、Enable を Readiness の横でクリックし、以下のパラメーターを構成します。完了したら、Update をクリックします。
-
Path: /readiness。(アプリケーションがバージョン 4.1.10 より前のエージェントを使用している場合は、パスを /health に設定してください。エージェントバージョンを確認するには、MSE コンソールで Microservices Governance > Application Governance に移動し、アプリケーションをクリックして Node details を選択します。右側にエージェントバージョンが表示されます。)
-
Port:
55199。 -
Initial Delay (s): この値は、アプリケーション起動時間 と設定された 遅延登録持続時間(デフォルトは 0 秒) の合計より大きく設定することを推奨します。ただし、この推奨に従わなくても機能は正しく動作します。
-
その他のパラメーターの詳細については、「ステートレスワークロード(Deployment)の作成」をご参照ください。アプリケーションを再起動すると、サービス登録が完了した後でのみ readiness プローブが合格します。
-
この操作により、アプリケーションが直ちに再起動されます。本番環境で実行する場合は、スケジュールされたメンテナンスウィンドウ内で行ってください。
(オプション)遅延登録持続時間を構成する
この設定はオプションであり、ビジネス要件に応じて構成できます。詳細については、「遅延サービス登録」をご参照ください。以下の手順に従ってください。
-
ステップ 1 およびステップ 2 に従い、グレースフル起動ページに移動して機能を有効化し、Kubernetes サービス readiness プローブを構成します。
-
グレースフル起動およびシャットダウンの Configuration Information を変更します。グレースフル起動モジュールの左側にある arrow をクリックして設定を展開します。Delayed Registration Duration (s) フィールドに値を入力し、OK をクリックします。
設定された遅延登録持続時間は、次回アプリケーション起動時から有効になります。
(オプション)低トラフィックウォームアップ持続時間を調整する
グレースフル起動を有効化すると、この機能も自動的に有効になり、ウォームアップ持続時間のデフォルト値は 120 秒になります。ビジネス要件に応じてこの持続時間を調整できます。
-
ステップ 1 およびステップ 2 に従い、グレースフル起動ページに移動して機能を有効化し、Kubernetes サービス readiness プローブを構成します。
-
グレースフル起動およびシャットダウンの Configuration Information を変更します。グレースフル起動モジュールの左側にある arrow をクリックして設定を展開します。Advanced Options をクリックします。Low-traffic Warm-up Duration (s) フィールドに値を入力し、OK をクリックします。
-
ウォームアップ対象サービスのコンシューマーが MSE クラウドネイティブゲートウェイである場合、ここで構成された低トラフィックウォームアップは有効になりません。代わりに、MSE クラウドネイティブゲートウェイでウォームアップ設定を行ってください。ゲートウェイコンソールで対象のゲートウェイインスタンスをクリックします。左側ナビゲーションウィンドウで、Routes > Services を選択します。該当サービスを見つけ、Actions 列で More > Policies をクリックします。Policies タブの Traffic Management > Load Balancing Configuration で Edit をクリックし、Warm-up Time 設定を調整します。ゲートウェイのデフォルトウォームアップ QPS 曲線は線形ですが、これは MSE Microservices Governance が提供する二次曲線とは若干異なりますが、実用上の効果は類似しています。
-
調整された低トラフィックウォームアップ持続時間は、次回アプリケーション起動時から有効になります。
-
低トラフィックウォームアップ機能は、コンシューマー側で各プロバイダーインスタンスの起動時刻に基づいて重みを計算し、負荷分散アルゴリズムを使用して新しく起動したアプリケーションへのトラフィックを徐々に増加させることで、サービスのウォームアップを支援します。これには、サービスのコンシューマーが MSE Microservices Governance に接続されていることも必要です。
-
低トラフィックウォームアップ機能を初めて使用する場合は、デフォルトのウォームアップ持続時間を使用することを推奨します。ウォームアップが効果的でない、またはトラフィック損失が発生する場合は、このパラメーターを調整して最適化してください。
-
十分なウォームアップを確保するには、「低トラフィックウォームアップのベストプラクティス」をご参照ください。
グレースフル起動の観測
これらの構成を適用後、次回アプリケーション起動時に、グレースフル起動およびシャットダウンページでインスタンスの起動・シャットダウン時刻と QPS 曲線を確認できます。
MSE コンソール にログインし、上部ナビゲーションバーでリージョンを選択します。
左側ナビゲーションウィンドウで、 を選択します。表示されたページで、管理対象のアプリケーションのリソースカードをクリックします。
アプリケーション詳細ページで、左側ナビゲーションウィンドウの Traffic management をクリックし、Graceful Start/Shutdown タブをクリックします。
-
Start and Shutdown Overview サブタブで、左側のインスタンスをクリックします。右側に、起動フェーズ中に発生した QPS 変化と関連イベントが表示されます。

サービス登録、ウォームアップ開始、ウォームアップ終了などのイベントが順番に発生していることが確認できます。「Kubernetes readiness プローブ合格」イベントも「サービス登録」イベントの後に発生します。QPS 曲線は、ウォームアップ持続時間(デフォルト 120 秒)中に急激にスパイクするのではなく、徐々に最大値まで増加します。起動時にイベントシーケンスや QPS 曲線の形状が期待通りでない場合は、「よくある質問」を参照してトラブルシューティングを行ってください。
図の例では、アプリケーションの Kubernetes readiness プローブがエンドポイント 55199/readiness を使用するように構成されており、最小 ready 時間(minReadySeconds)が 120 秒に設定されています。これはデフォルトのウォームアップ持続時間と一致しています。