web-dev-qa-db-ja.com

WebSocketを使用したインスタントメッセージング

WebSocketを使用してインスタントメッセンジャーを開発しようとしています。

サーバーの複数のインスタンスを実行しています(たとえば、server1、server2)。お互いにチャットしたい2人のユーザー(userA、userBなど)。しかし、別のサーバーに接続されています。 UserAからServer1へ、UserBからserver2へ

実装方法に関する提案が必要

アプローチ1:

最初は、接続が(接続が確立されたときはいつでも)保管される中央データベースを持つことを考えていました。 (最も単純なテーブル構造)のようなもの

User_id , Socket_object  

UserAがuserBにメッセージを送信しているとしましょう。

そのため、レシーバー(userB)のソケットオブジェクトをデータベースからフェッチし、メッセージを直接UserBに送信します。しかし、後でServerSocketオブジェクトがJavaでシリアル化できないことを知りました。

アプローチ2:

接続が確立されるたびに、接続を受け入れたサーバーは以下の詳細をテーブルに保存できます。

 user_id , server_name , server_port 

サーバーがメッセージを受信したとき。テーブルから宛先サーバーの詳細を取得し、その宛先サーバーへの接続(おそらく永続性は必要ないため、おそらくHTTP)を作成し、メッセージをプッシュします。次に、宛先サーバーはその情報をそれぞれのユーザーに渡します。

実装をどのように進めるか?それを実装する他のより良い方法はありますか?.

一部のサードパーティライブラリを提案しないでください。

1
asura

2番目のアプローチは最初の1よりも音が良いですが、使用しません。サーバーに大量のメッセージをロードするときにデータベースを処理すると、時間がかかる場合があります。

この問題の最良の解決策は、パブリッシュサブスクライブを実装するRedisなどのメモリ内データベースです。

開発時間を大幅に節約し、パフォーマンスが向上します。

自分で何かを実装したい場合は、これらのサーバーの前にロードバランサーを開発することをお勧めします。

ユーザーが接続したいときはいつでも、メッセージをサーバーにナビゲートし、データ構造を持つサーバーXに接続されていることを維持します。

それは本の管理を担当し、関連するサーバーに各メッセージをナビゲートします。

一部のサーバーが別のサーバーでユーザーXからユーザーYにメッセージを受信すると、メッセージを正しいサーバーにルーティングするロードバランサー(または呼び出したいもの)に送信します。

ユーザーとサーバー間のメモリマッピングでは、データベースの代わりにチャットするのが最善だと思います。

1
Dev93