サーバーのクラスターで一度だけ実行したいタスクがある場合、定期的にこれを達成するための最良の方法は何ですか?この場合のクラスターの定義は、ロードバランサーの背後に分散セッションを持つ2つ以上の同一サーバーです。
使用例: X時間に1回のみ実行する必要がある実行コストの高いタスクがあります。このジョブは、たとえば多数のレコードを反復処理し、そのステータスを更新できます。
- 最悪のシナリオは、ジョブを2回実行するとデータが無効になることです。
- 最良のシナリオは、ジョブがすべてのサーバー上のリソースを利用することです。
要件の概要:
- ノードの1つがダウンしている場合でも、ジョブを実行する必要があります。
- ジョブは、スケジュールごとに1回のみ実行する必要があります。
- 複数のジョブが同時にまたは重複してスケジュールされている場合、実行中のジョブの数はサーバー間で均等に分散されます。
- マシンは同じコードベースを持ち、NTPを介して同期する必要があります。
- 環境変数によって、構成はノードごとに異なる場合があります。
- ジョブは時間どおりに、または割り当てられた時間の特定の間隔内で開始する必要があります。(たとえば5分と言います)
可能な解決策
- 1つのノードをマスターノードとして設定します。上記1に違反するため、これは機能しません。
- ロードバランサーのバランスを取り、ジョブを開始するよう要求します。残念ながら、これには、同時に複数のジョブを実行している場合、それらがすべて同じマシンで実行されるという副作用があります。
これは、Javaのサーブレットコンテナで実行する必要があります。しかし、それは私が探している仕事をコーディングしていません。
確かにこれは既知の最良の解決策を備えた解決された問題です。
関連する質問。 /programming/5949038/schedule-job-executes-twice-on-cluster
上記の5つの要件に従ってソリューションが不十分であるため、これは重複ではありません。最も投票されたソリューションは人種問題に苦しみ、2番目のソリューションは要件3に違反します