時間のかかるタスク (巨大な xml ファイルの解析とデータの db への挿入) を複数のノードで処理する必要があります。ノードは多くなく、1 つのノードから始めます。
ファイルは FTP から読み取られます。ジョブはスケジュールされ、1 日 1 回実行されます。処理を分散するための適切で簡単な方法は何でしょうか?
私の現在のドラフトの考えは次のとおりです。
- hazelcast 分散を使用
ConcurrentMap
- 舞台裏でマップの同期を処理します - 各ノードはファイルのリスト全体を取得してシャッフルします
- 次に、各ノードは次を使用してリストを繰り返し
.putIfAbsent(..)
ます - ファイルがマップにない場合は、それを処理します。マップにある場合は、別のノードが処理していることを意味するので、次のファイルを試してください。
その方法:
- ノードがアイドル状態になることはありません
- ノードに障害が発生した場合、他のノードは引き続きすべてを処理します (遅くなるだけです)。
- ファイルが大きく、それらの処理に多くの時間がかかるため、
.putIfAbsent(..)
呼び出しと基礎となる同期での競合オーバーヘッドはほとんどありません (シャッフルはこれを改善することも目的としています)。 - 必要な構成は最小限であり、追加のサービス (メッセージ キューなど) のインストールと管理は必要ありません。
ただし、これが最善のアプローチであるかどうかはわかりません。大丈夫ですか?何を改善できますか?より良いものはありますか?