0

私はチャットの実装に取り​​組んでいます。アイデアは非常に単純です。キーがユーザー名で、値がユーザーに配信されるメッセージのキューであるマップがあります

このマップは、ConcurrentHashMap<String, <ConcurrentLinkedQueue<Message>>>

ユーザー宛ての新しいメッセージが到着すると、それがこのマップに書き込まれ、すべてのユーザーは単純な http プーリングを使用してキューからメッセージをフェッチします。このアプローチはうまく機能します。

今、クラスターに同様の機能を実装する必要があります。キャッシュのレプリケーションには、jboss キャッシュを使用します。現在、キャッシュのレプリケーションは同期方式で機能しています。これは、他のノードに書き込む前に、ローカル ノードでキャッシュへの書き込みが発生しないことを意味します。

基本的に、キャッシュ インターフェイスは、put メソッドと get メソッドを使用した map に似ています。

今、私はキュー全体を複製します。新しいメッセージが到着したら、マップからキューを取得し、キューに新しいメッセージを追加し、すべてのノードで新しいキューを「プット」(書き換え) します。

新しいメッセージを取得して現在のキューを複製する要求がユーザーから来ると、このユーザーに関連付けられたキューをすべてのノードで空にし、複製されたキューからユーザーにメッセージを配信します。

何かがうまくいかない場合が多いと思います。たとえば、ノードAのキューにメッセージを入れ、キューのレプリケーションが開始され、現在、別のノードBのユーザーがキューからメッセージをフェッチして、キューを空にしています。その後、ノード A からのキューの複製が完了し、ノード B は既に配信されたメッセージを再度取得しました。ユーザーが同じメッセージを 2 回受信する

このメッセージ ルーチンをクラスタに実装する一般的な方法は何ですか?

4

1 に答える 1

0

要するに、メッセージング。JMSに基づいて独自にロールすることも、エンタープライズサービスバスを使用することもできます。

于 2011-10-06T03:36:05.423 に答える