2017-04-03 13 views
0

チャットアプリケーション用のソケットio実装を検討しています。 ブロードキャスト中に紛失したメッセージを処理するための肯定応答サポートを見つけることで、肯定応答サポートが検討されています。ドキュメントごとに ソケットioは、ブロードキャスト/ルームのコールバックをサポートしていません。ソケットioブロードキャスト、ルームと確認応答機能

"Room 1"では、その部屋のすべてのソケットにブロードキャストメッセージを送信します。コールバックを行わないでチェックすると、一部のユーザー/ソケットがメッセージを見逃してしまった。私たちはそれをどのようにシステムで処理するのでしょうか。

以下のコードは機能しません。

io.sockets.in(data.room).emit('message', data, function(responseData){ 
      console.log(responseData); 
     }); 

放送時にコールバックがサポートされていない https://github.com/socketio/socket.io-redis/issues/30 問題の下によります。

このシナリオを処理する他の方法は何ですか?

答えて

2

問題を解決するには、部屋のメッセージをどこかに残してから、必要に応じて個々のクライアントに再送信する必要があります。

メッセージを格納する最も明白な場所は、データストア(例:Redis)のサーバー側です。各会話を効果的にイベントのリストとして保存し、発生したときに新しいイベントを追加します。次のように

簡単なスキームは動作します:

  • 各ブロードキャストメッセージは、それに添付UUIDを持っています。サーバーが新しいメッセージを処理するとき、そのメッセージは「その部屋」のリストに追加されます。
  • クライアントが接続/再接続すると、受信した最後のメッセージのUUIDを示すメッセージ(「LAST_MESSAGE_RECEIVED」など)が送信されます。
  • サーバーはこれらの「LAST_MESSAGE_RECEIVED」メッセージのいずれかを受信すると、そのメッセージがルームの最新のメッセージであるかどうかを確認し、そうでない場合は、メッセージが欠落している個々のソケットにメッセージを送信します。クライアントは最新の状態に戻ります。

オルタナティブ:会話が終了した後、あなたが歴史を維持する必要がない場合、あなたは賢いことと、他のクライアントが既にメッセージを格納しているという事実を使用し、再送信するためにクライアントを求めることができますメッセージはピアツーピアのような形で表示されます。これにより、独自のサーバー側データストアを用意する必要がなくなります。

関連する問題