web-dev-qa-db-ja.com

ロードバランサーを介して接続されたWebSocketクライアントにメッセージを配信します

問題

多数のクライアントがwebsocketを介してロードバランサーを介してWebアプリケーションのnodesに接続されています。私が必要としているのは、ユーザーごとに通知を配信することです。

私の考え

私の考えは、各Webアプリケーションノードをメッセージングシステム(RabbitMQ、Apache Kafka)に接続し、各ノードにキュー( "node1-queue"など)を作成させてから、メッセージ発行システムが関係user -> queue.

さて、これは私が車輪の再発明をしているのか、そしていくつかのフレームワークがすでにこの機能を箱から出して提供しているのかどうか疑問に思う幅広い問題のようです。

1
Piero Nadello

メッセージをすべてのノードにブロードキャストしてから、ノードにWebSocketを介してクライアントに転送するメッセージを選択させるのはなぜですか?

メッセージがたくさんある場合(ネットワークへの影響が顕著になるほど)、ルーティングキーでユーザーIDを使用するのは簡単かもしれませんMQSとノード間のトラフィックを削減する方法。

部屋やユーザーとのチャットアプリケーションがあるとします。 トピック交換 を使用すると、123号室に投稿されたユーザー456のメッセージを送信するときに、chat.room123.user456などのルーティングキーを使用できます。これらのメッセージは、リッスンするバインディングキーchat.room123.*を持つキューを持つことで利用できます。特定の部屋のすべてのメッセージに。バインディングキーchat.*.user456を使用して、部屋とは関係なく、特定のユーザーによって投稿されたメッセージを利用することもできます。それを拡張するために、いくつかのサーバーがいくつかの部屋を処理し、他のサーバーがいくつかのユーザーを処理する場合があります。たとえば、特定のサーバーがユーザー17、41、および48へのWebSocket接続を持ち、バインディングキーchat.*.user17chat.*.user41、およびchat.*.user48を持っている場合があります。

ここで注意が必要なのは、WebSocket接続が切断され、クライアントが別のノードに再接続する場合の処理​​です。 スティッキーセッション この問題を解決できる可能性があります。それを除けば、エラーの処理とWebSocket接続の喪失は、メッセージキューサービスからのメッセージを前処理してサードパーティに送信する必要がある他のシナリオと同じです。

1