マイクロサービスエンジン (MSE) XXL-JOB は、オープンソースの XXL-JOB が提供する機能に加えて、グレースフルシャットダウン機能を提供します。MSE XXL-JOB は、アプリケーションをグレースフルシャットダウンする前に、サーバーに新しいジョブのディスパッチを停止するように通知し、すべての実行中のジョブが完了するまで待機します。このプロセス中にビジネスの中断は発生しません。このトピックでは、実際のアプリーケーションの再起動またはシャットダウンシナリオを処理するために、Alibaba Cloud XXL-JOB ベースのグレースフルシャットダウンを有効にする方法について説明します。
概要
実際のビジネスシナリオでは、アプリケーションプロセス内のジョブは一定の頻度でスケジュールされます。アプリケーションがリリースされて再起動されると、実行中のジョブは強制的に停止され、データが不完全になったり、スケジューリングの成功率が急激に低下したりする可能性があります。その結果、次の理由により、ビジネスデータの問題が発生します。
ジョブ実行の中断: ジョブの実行中にアプリケーションプロセスが終了し、ビジネス処理が停止します。これにより、ビジネスデータが不完全になる可能性があります。
ジョブスケジューリングの成功率の低下: アプリケーションのリリースと再起動のプロセス中に、スケジューラは終了したノードにジョブを配信します。これにより、ジョブスケジューリングが失敗し、ジョブ処理の全体的な効率が低下します。
ジョブスケジューリングにおける前述の問題に対処するには、アプリケーションのローリングデプロイメント再起動プロセス中にビジネスの継続性をシームレスに確保するために、ジョブのグレースフルシャットダウンを有効にする必要があります。
オープンソース XXL-JOB ベースのグレースフルシャットダウンの実装方法
前提条件
エンジンバージョンは 2.1.0 以降です。エンジンバージョンの詳細については、「XXL-JOB のリリースノート」をご参照ください。
SchedulerX プラグインパッケージに関連する依存関係が、クライアントの pom.xml ファイルに追加されます。XXL-JOB プラグインバージョンの詳細については、「XXL-JOB プラグインのリリースノート」をご参照ください。
<dependency> <groupId>com.aliyun.schedulerx</groupId> <artifactId>schedulerx3-plugin-xxljob</artifactId> <version>最新バージョン</version> </dependency>
手順
このセクションでは、さまざまなビジネスフォームとデプロイシナリオに対して、グレースフルシャットダウンソリューションを構成して有効にする方法について説明します。手順は 2 つのステップで構成されます。
ステップ 1: さまざまなフレームワークを使用して Executor との初期統合を実行する
ビジネスアプリケーションのさまざまなデプロイモードでは、初期統合にさまざまな方法が必要です。
モード 1: Spring Boot を使用してビジネスアプリケーションを XXL-JOB Executor と統合する (推奨)
Spring Boot を使用してビジネスアプリケーションを XXL-Job Executor と統合する場合、システムはグレースフルシャットダウンの初期統合を自動的に実行できます。次の手順を実行します。
SchedulerX プラグインの Maven 依存関係を追加します。プラグインバージョンの詳細については、「プラグインバージョンのリリースノート」をご参照ください。
<dependency> <groupId>com.aliyun.schedulerx</groupId> <artifactId>schedulerx3-plugin-xxljob</artifactId> <version>最新バージョン</version> </dependency>アプリケーション構成パラメーターを追加し、グレースフルシャットダウンを有効にします。パラメーターの詳細については、「パラメーターの説明」をご参照ください。
# グレースフルシャットダウンを構成する xxl.job.executor.shutdownMode=WAIT_ALL
モード 2: Spring を使用してビジネスアプリケーションを XXL-JOB Executor と統合する
ビジネスアプリケーションが Spring フレームワークを使用して起動される Web アプリケーションである場合は、POM 依存関係と アプリケーション起動パラメーターを追加する必要があります。詳細については、「モード 1: Spring Boot を使用してビジネスアプリケーションを XXL-JOB Executor と統合する (推奨)」をご参照ください。また、次の XxlJobExecutorEnhancerInitializer 構成を web.xml ファイルに追加する必要があります。
<web-app>
<context-param>
<!-- Spring ApplicationContextInitializer は、XXL-JOB Executor の機能を向上させるために使用されます。 -->
<param-name>globalInitializerClasses</param-name>
<param-value>com.aliyun.schedulerx.xxljob.enhance.XxlJobExecutorEnhancerInitializer</param-value>
</context-param>
</web-app>モード 3: フレームレスモードでビジネスアプリケーションを XXL-JOB Executor と統合する
XXL-JOB Executor のユースケースで説明されているように、フレームレスモードでビジネスアプリケーションを XXL-JOB Executor と統合する場合、純粋な Java でビジネスアプリケーションを起動するときに、カスタムコードを使用してグレースフルシャットダウンの初期統合を実行できます。ビジネスアプリケーションの POM 依存関係と アプリケーション起動パラメーターを追加する必要があります。詳細については、「モード 1: Spring Boot を使用してビジネスアプリケーションを XXL-JOB Executor と統合する (推奨)」をご参照ください。次のコードは例を示しています。
Executor を起動する前に、
EnhancerLoader.load(xxlJobProp)を追加して、機能拡張を読み込みます。Executor を起動する前に、
Runtime.getRuntime().addShutdownHook(...)を追加して、現在のアプリケーションのシャットダウンフックを追加します。
ステップ 2: アプリケーションをシャットダウンする
セルフビルド CD プロセスで kill -15 を使用する
セルフビルドの継続的デリバリー (CD) プロセスでは、1 つのノードを使用してアプリケーションプロセスを停止できます。このノードでは、stop.sh という名前のスクリプトを作成して、アプリケーションプロセスを停止または終了できます。スクリプトコンテンツには、アプリケーションのグレースフルシャットダウンのロジックが含まれている必要があります。次のコードは、アプリケーションプロセスのシャットダウンのサンプルスクリプトコンテンツを示しています。
Kubernetes デプロイメントの preStop フックを使用する
Kubernetes ポッドのライフサイクル管理機能は、グレースフルシャットダウンを自動的に実装できます。また、preStop フックを使用して、exec を実行してスクリプトを実行し、HTTP リクエストを使用することにより、グレースフルシャットダウンロジックを実装することもできます。
無効な変更: アプリケーションプロセスがコンテナー内のメインプロセス PID 1 である場合、システムは SIGTERM 信号をメインプロセスに自動的に送信して、アプリケーションをグレースフルシャットダウンします。
カスタム preStop: コンテナーに複雑なマルチプロセス関係がある場合は、
kill -15 PIDを使用してアプリケーションプロセスを停止するカスタム preStop スクリプトを構成できます。事前に構成されたstop.shスクリプトを呼び出して、アプリケーションプロセスを終了することもできます。
このソリューションでは、ポッドの terminationGracePeriodSeconds パラメーターは、グレースフルシャットダウンの最大待機時間を秒単位で指定します。このパラメーターのデフォルト値は 30 です。ビジネス要件に基づいてパラメーターを構成する必要があります。
apiVersion: apps/v1
kind: Deployment
metadata:
name: my-app
spec:
replicas: 3
selector:
matchLabels:
app: my-app
template:
metadata:
labels:
app: my-app
spec:
containers:
- name: my-app-container
image: my-app-image:latest
lifecycle:
preStop:
exec:
# command: ["/bin/sh", "-c", "kill -15 PID && sleep 30"]
command: ["/bin/sh", "-c", "スクリプトパス/stop.sh"]Alibaba Cloud のアプリケーションリリースプラットフォームで自動統合を使用する
このソリューションは近日中に利用可能になります。
パラメーターの説明
アプリケーションのグレースフルシャットダウンを有効にするには、次のパラメーターを構成する必要があります。このパラメーターは、グレースフルシャットダウンを実装するための 2 つのモードを提供します。
# グレースフルシャットダウンモード。有効な値: WAIT_ALL と WAIT_RUNNING。
# このパラメーターを構成しない場合、XXL-JOB の元のロジックが適用され、グレースフルシャットダウンはデフォルトで無効になります。
xxl.job.executor.shutdownMode=WAIT_ALLグレースフルシャットダウンモード | 説明 |
| このモードでは、実行中のジョブとキュー内のジョブを含むすべてのジョブが完了した後でのみ、アプリケーションが終了します。このモードをお勧めします。 |
| このモードでは、アプリケーションでスレッドが割り当てられている実行中のジョブが完了した後、アプリケーションが終了します。キュー内のジョブはドロップされます。 |



