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)を作成し、メッセージをプッシュします。次に、宛先サーバーはその情報をそれぞれのユーザーに渡します。
実装をどのように進めるか?それを実装する他のより良い方法はありますか?.
一部のサードパーティライブラリを提案しないでください。
2番目のアプローチは最初の1よりも音が良いですが、使用しません。サーバーに大量のメッセージをロードするときにデータベースを処理すると、時間がかかる場合があります。
この問題の最良の解決策は、パブリッシュサブスクライブを実装するRedisなどのメモリ内データベースです。
開発時間を大幅に節約し、パフォーマンスが向上します。
自分で何かを実装したい場合は、これらのサーバーの前にロードバランサーを開発することをお勧めします。
ユーザーが接続したいときはいつでも、メッセージをサーバーにナビゲートし、データ構造を持つサーバーXに接続されていることを維持します。
それは本の管理を担当し、関連するサーバーに各メッセージをナビゲートします。
一部のサーバーが別のサーバーでユーザーXからユーザーYにメッセージを受信すると、メッセージを正しいサーバーにルーティングするロードバランサー(または呼び出したいもの)に送信します。
ユーザーとサーバー間のメモリマッピングでは、データベースの代わりにチャットするのが最善だと思います。