3

時間のかかるタスク (巨大な xml ファイルの解析とデータの db への挿入) を複数のノードで処理する必要があります。ノードは多くなく、1 つのノードから始めます。

ファイルは FTP から読み取られます。ジョブはスケジュールされ、1 日 1 回実行されます。処理を分散するための適切で簡単な方法は何でしょうか?

私の現在のドラフトの考えは次のとおりです。

  • hazelcast 分散を使用ConcurrentMap- 舞台裏でマップの同期を処理します
  • 各ノードはファイルのリスト全体を取得してシャッフルします
  • 次に、各ノードは次を使用してリストを繰り返し.putIfAbsent(..)ます - ファイルがマップにない場合は、それを処理します。マップにある場合は、別のノードが処理していることを意味するので、次のファイルを試してください。

その方法:

  • ノードがアイドル状態になることはありません
  • ノードに障害が発生した場合、他のノードは引き続きすべてを処理します (遅くなるだけです)。
  • ファイルが大きく、それらの処理に多くの時間がかかるため、.putIfAbsent(..)呼び出しと基礎となる同期での競合オーバーヘッドはほとんどありません (シャッフルはこれを改善することも目的としています)。
  • 必要な構成は最小限であり、追加のサービス (メッセージ キューなど) のインストールと管理は必要ありません。

ただし、これが最善のアプローチであるかどうかはわかりません。大丈夫ですか?何を改善できますか?より良いものはありますか?

4

1 に答える 1

1

あなたのコメントに基づいて、JMSの使用を検討することをお勧めします(ActiveMQのように、使用/開発が最も簡単であることがわかりました)

スタンドアロン、冗長、および/または組み込みが可能です。

メッセージをキューに追加して、任意の数のノードから消費できます。自動コミットをオフにすると、失敗したノードのメッセージが自動的にキューに返されます。

于 2012-08-15T12:56:18.850 に答える