2つのTomcatインスタンスの前にnginxロードバランサーがあり、それぞれにSpringBootアプリケーションが含まれています。各SpringBootアプリケーションは、データベースにデータを書き込むバッチを実行します。バッチは毎日午前1時に実行されます。問題は、両方のインスタンスがバッチを同時に実行することですが、これは望ましくありません。
バッチを2つのインスタンスにデプロイしたままにして、tomcatまたはnginxにマスターサーバーでバッチを開始するように指示する方法はありますか(スレーブサーバーはバッチを実行しません)。
サーバーの1つが停止した場合、2番目のサーバーが彼に代わってバッチを開始できます。
それを行うためのツールがnginxまたはtomcat(または他のテクノロジー)にありますか?
前もって感謝します。
これは単純な設計アプローチです。
2つのVMで同時にトリガーされる2つのスケジュールされたメソッドがあるため、両方にランダムな遅延を追加します。この回答には、ランダムな期間トリガーを遅らせる方法に関する多くのオプションがあります。Spring @ Scheduledアノテーションのランダム遅延
メソッド内では、(他のVMによって)まだ開始されていない場合にのみジョブを実行します。これは、これを追跡するための新しいテーブルを使用して実行できます。
この設計の擬似コードは次のとおりです。
@Scheduled(cron = "schedule expression")
public void batchUpdateMethod() {
//Check database for signs of job running now.
if (job is not running){
//update database table to indicate job is running
//Run the batch job
//update database table to indicate job is finished
}
}
2つのVMは互いに独立しているため、データベースまたは一般的なファイルの場所を2つの実行間で同期するためのロックとして使用する必要があります。
より堅牢な設計については、Spring Batchを検討してください。SpringBatchは、ジョブにデータベース(JobsRepository)を使用します。デフォルトでは、実行中のジョブとそのステータスを追跡するために、メモリ内のデータソースが使用されます。セットアップでは、2つのインスタンスは(ほとんどの場合)独自のインメモリデータベースを使用しています。jobsRepositoryデータベースが共有されている場合、Spring Batchの複数のインスタンスはクラスターとして相互に調整でき、一方はジョブを実行でき、もう一方はactasaバックアップを実行できます。このためには、共通のデータソースを使用するように2つのインスタンスを構成する必要があります。
ここにいくつかのドキュメントがあります:https://docs.spring.io/spring-batch/docs/current/reference/html/index-single.html#jobrepository
https://docs.spring.io/spring-batch/docs/current/reference/html/job.html#configuringJobRepository
この記事はインターネットから収集されたものであり、転載の際にはソースを示してください。
侵害の場合は、連絡してください[email protected]
コメントを追加