私はJavaで分散ファイル処理システムを構築しようと計画段階にあり、フィードバックとアドバイスを探しています:
問題:取得、処理、および転送する必要があるFTPサーバーに継続的にポストされる多数のファイルがあります。
ソリューションのアイデア:マスターノードはFTPサーバーで新しいファイルを探し、子ノードに処理作業を割り当てます。マスターノードは子にJMSメッセージを送信して処理するファイルを伝え、子は処理が完了すると応答を返し、さらに作業を要求します。
マスターノードが何らかの理由でダウンした場合、子ノードの1つがマスターの役割を引き継ぐ必要があります。これを実装するための私のアイデアは、マスターノードに関する情報とロックの有効期限を含む「ロック」コレクションをMongoDBに含めることでした。約15秒ごとに、マスターノードはロックを更新し、有効期限を将来の30秒に更新します。子ノードがロックの期限が切れていることを確認すると、子ノードの1つが自分自身をマスターノードとして割り当てます。
私はこのデザインに関するフィードバックを探しています。このような何かのために活用できる既存の改善/ Javaフレームワークまたはツールに関するアドバイスを誰かが持っているかどうか疑問に思っています。
ありがとう!
まあ、「リーダー選挙」問題はかなりよく知られており、それを解決するために最も一般的に使用されるアプリはおそらく Apache Zookeeper でしょう。
グーグルで検索すれば、それに関するドキュメントがたくさん見つかります。
実際の例が必要な場合-これは、Apache HadoopがZookeeperを使用してHAを実装する方法です https://github.com/hopshadoop/Hops/blob/master/hadoop-common-project/hadoop-common/ src/main/Java/org/Apache/hadoop/ha/ZKFailoverController.Java
ワーカーノードはファイルが到着するファイルシステムを見ることができますか?
はいの場合は、他のチャネルを使用してそれらと通信しないでください。代わりに、標準的な旧式のUnixテクニックと低レベルUnixの半原子性を使用して、ファイルシステム経由ですべてのシグナリングを実行してくださいFS操作。
いいえの場合、ワーカーはどのように処理のためにファイルを収集しますか?例えば。ファイルが大きすぎてJMSで直接送信できませんか?
設計上、3つの独立した経路があります。
•非同期通知メカニズム(JMS)•データ配信(???-ワーカーが実際に処理するファイルバイトを取得する方法)•分散ロック(現在データベースとして提案されています)
これは多すぎます。これらのタイプのソリューションは、1つのメカニズム(ワーカーがファイルシステムを直接表示するか、ファイルシステムをスキャンできる場合)と2(ワーカーがFSに直接アクセスできない場合)で実行できます。