いくつかのリソースを配布するためにマルチキャスト通信を実装しようとしています。そのためにjGroupsを使用 しているので、信頼できるマルチキャストとFIFOオーダーがあります。そうすることで、分散ソリューションで、つまりコーディネーターとして機能するマスター ノードがないことを実現したいと考えています。
すべてのノードが配布を開始できるため、2 つ以上のノードが同時に配布を開始する可能性があります。ノードが配布メッセージを受信すると、これに応答します。応答メッセージとスターターからのメッセージに違いはありません。リソース名 (resourceA など) に関する情報と、そのノードがそれを処理できるかどうかのみが含まれます。Member1 が配布を開始すると、次のようなメッセージが送信されます。
Member1, resourceA, OK
Member2 にはそのリソース用のスペースがなく、次のような応答メッセージを送信します。
Member2, resourceA, NOT_OK
この場合、Member1 は resourceA を取得できることを知っているため、簡単です。複数のノードがリソースを処理できる場合、他のプロパティがリソースを取得するユーザーを決定します (たとえば、最も高い ID を持つメンバー)。
私の問題は、2 つ以上のノードが同じトピック (resourceA) について同時に配布を開始している場合、どのように処理するかということです。
この方法で問題が発生することはありますか? Member1 と Member2 が同時に配布を開始しています。この時点で、両者はお互いからの応答を期待しています。応答メッセージまたはスターター メッセージに違いがないという事実のために、両方とも、受信したばかりのメッセージが応答者であると考えています。そのため、Member1 はスターター メッセージをマルチキャスト グループに送信し、Member2 はスターター メッセージをマルチキャスト グループに送信します (Member1 からメッセージを受信する前に)。現在、Member1 は Member2 からスターター メッセージを受信しており、これが応答であると考えています。
すべてのノードが (スターターとして、または応答と共に) トピックごとに 1 つのメッセージのみを送信することを保証することで、3 つ以上のノードがある場合でも、この方法で問題はないと言えます。