アプリケーションをリリースする際、初期化に固定遅延を使用すると、遅延が正しく設定されていない場合にデプロイ効率が低下したり、エラーが発生したりする可能性があります。グレースフル起動のための条件付き登録は、ビジネスロジックがサービスの準備完了を確認した後にのみサービス登録をトリガーします。このアプローチにより、サービス登録のタイミングを正確に制御できます。サービスが完全に準備された後にのみトラフィックを受信することが保証され、不要なデプロイ遅延を防ぎます。
背景情報
非同期初期化やリソースの読み込みを伴うシナリオでは、マイクロサービス登録の前に固定遅延がよく使用されます。これは、Microservice Engine (MSE) が提供するグレースフル起動機能の 1 つです。このメソッドは、アプリケーションが完全に初期化される前にリクエストを処理することを防ぎ、呼び出し元サービスでの障害発生を回避します。このメソッドは実装が簡単で、ほとんどの状況でサービスの準備ができていないことによる呼び出し例外を効果的に軽減します。
しかし、一部の複雑なシナリオでは、固定遅延登録の精度や適応性が不足する場合があります。固定遅延がアプリケーションのタイミング要件を満たさない場合は、次のセクションで説明する条件付き登録メカニズムを使用できます。
この機能を使用するには、ビジネスコードにロジックを追加してシステムプロパティを設定する必要があります。先に進む前に、このコード修正のコストを評価してください。MSE のグレースフル起動およびシャットダウン機能に慣れていない場合は、まず固定遅延登録ソリューションを使用してください。これは、ほとんどの典型的なアプリケーションシナリオをカバーします。
この機能はパブリックプレビューであり、MSE エージェントのバージョン 4.6.0 以降が必要です。詳細については、「MSE エージェントのバージョンを指定する」をご参照ください。
仕組み
MSE エージェントは、起動パラメーターまたは環境変数で指定されたパラメーターを継続的にポーリングします。アプリケーションがカスタム初期化ロジックを完了した後、コードはこのパラメーターの値を true に設定します。エージェントがこの条件が満たされたことを検出すると、マイクロサービス登録をトリガーします。
この機能を Kubernetes の readiness プローブと共に使用する場合、アプリケーションの起動と公開のフローは次のようになります。
Pod が起動 → コンテナー内のアプリケーションがビジネス初期化を開始 → ビジネスの準備が完了し、コード内で条件が設定される → エージェントがマイクロサービス登録を開始 → マイクロサービス登録が成功し、サービスがマイクロサービストラフィックの受け入れを開始 → Kubernetes の readiness プローブ が成功 → Pod のステータスが Ready に変わる。
手順
ステップ 1: 起動パラメーターで条件付き登録を有効にする
アプリケーションの起動パラメーターまたは環境変数に、次の構成を追加して、条件付き登録のためのシステムプロパティキーを宣言します。
フォーマット:
mse_lossless_register_condition_on_system_property_true="YOUR_CONDITION_KEY"構成例:
# カスタムシステムプロパティキー PRODUCT_PRELOAD_COMPLETED の値が true であることを登録条件として使用します。 mse_lossless_register_condition_on_system_property_true="PRODUCT_PRELOAD_COMPLETED"
ステップ 2:ビジネスコードを修正して準備完了条件を設定
アプリケーションが必要なすべての初期化ロジックを完了した後、前のステップで定義したシステムプロパティキーをコード内で true に設定します。
次のコードは、プロダクトキャッシュが非同期でロードされるシナリオを示しています。キャッシュがロードされると、System.setProperty メソッドを使用して準備完了条件が設定され、サービス登録がトリガーされます。
@Component
public class HotProductInitComponent {
public ScheduledExecutorService executor = Executors.newScheduledThreadPool(
1,
new NameThreadFactory("product-preload-pool"));
@Value("${demo.product.init.delay.seconds:3}")
public long initDelaySeconds;
public void asyncLoadPoductDataIntoCache() {
executor.schedule(() -> {
// ...
// ********** 新しいコードの開始 **********
System.setProperty("PRODUCT_PRELOAD_COMPLETED", "true");
// ********** 新しいコードの終了 **********
}, initDelaySeconds, TimeUnit.SECONDS);
}
}考慮事項
この機能は、55199/readiness エンドポイントの readiness プローブと併用できます。
条件付き登録を有効にした後、グレースフル起動のための遅延登録を構成する必要はありません。起動パラメーターまたは環境変数で
mse_lossless_register_condition_on_system_property_trueパラメーターを構成すると、この機能は自動的に有効になります。グレースフル起動オプションを有効にする必要はありません。