web-dev-qa-db-ja.com

socket.ioでRedisStoreを使用する例

複数のプロセスやサーバーにまたがって単純なsocket.ioアプリをスケーリングしようとしています。

Socket.ioはRedisStoreをサポートしていますが、その使用方法について混乱しています。

私はこの例を見ています http://www.ranu.com.ar/post/50418940422/redisstore-and-rooms-with-socket-io

しかし、そのコードでRedisStoreを使用する方法が、MemoryStoreを使用する方法とどのように異なるか理解できません。誰かがそれを私に説明できますか?

また、redisstoreを使用するようにsocket.ioを構成することと、独自のredisクライアントを作成して独自のデータを設定/取得することの違いは何ですか?

私はnode.js、socket.io、およびredisを初めて使用するので、明らかなものを逃した場合は指摘してください。

28
Rollin_s

しかし、そのコードでRedisStoreを使用する方法が、MemoryStoreを使用する方法とどのように異なるか理解できません。誰かがそれを私に説明できますか?

違いは、デフォルトのMemoryStoreを使用すると、IPCがないため、ワーカーで発行するメッセージは同じワーカーに接続されているクライアントにのみ送信されるということです。 RedisStoreを使用して、メッセージはすべてのワーカーがサブスクライブしているredisサーバーに公開されます。したがって、メッセージはすべてのワーカーと接続されているすべてのクライアントによってピックアップされ、ブロードキャストされます。

また、redisstoreを使用するようにsocket.ioを構成することと、独自のredisクライアントを作成して独自のデータを設定/取得することの違いは何ですか?

私はRedisStoreに詳しくないので、すべての違いがわかりません。しかし、それを自分で行うことは、完全に有効な方法です。その場合、すべてのメッセージをredisサーバーにパブリッシュし、ソケットハンドラーでそれらをリッスンできます。おそらくもっと手間がかかりますが、設定方法をより細かく制御することもできます。私自身も似たようなことをしました:

_// Publishing a message somewhere
var pub = redis.createClient();
pub.publish("messages", JSON.stringify({type: "foo", content: "bar"}));

// Socket handler
io.sockets.on("connection", function(socket) {
  var sub = redis.createClient();
  sub.subscribe("messages");
  sub.on("message", function(channel, message) {
    socket.send(message);
  });

  socket.on("disconnect", function() {
    sub.unsubscribe("messages");
    sub.quit();
  });
});
_

これは、たとえば、さまざまなチャネルにパブリッシュ/サブスクライブするなど、より高度なメッセージルーティングを自分で処理する必要があることも意味します。 RedisStoreでは、socket.ioチャネル(io.sockets.of("channel").emit(...))を使用することで、その機能を無料で利用できます。

これの潜在的な大きな欠点は、socket.ioセッションがワーカー間で共有されないことです。これは、ロングポーリングトランスポートのいずれかを使用する場合、おそらく問題を意味します。

データストアとしてredisを使用する小さなgithubプロジェクトを設定しました。

これで、複数のsocket.ioサーバープロセスを実行できます。

https://github.com/markap/socket.io-scale

3

また、redisstoreを使用するようにsocket.ioを構成することと、独自のredisクライアントを作成して独自のデータを設定/取得することの違いは何ですか?

違いは、「RedisStore」を使用すると、socket.io自体がソケットのハートビートとセッション情報をRedisに保存し、node.jsでクラスターを使用する場合、ユーザークライアントが機能することです。

Redisがない場合、クライアントは次回にnode.jsプロセスを変更する可能性があるため、セッションは失われます。

2
Kaicui

違いは、node.jsインスタンスのクラスターが実行されている場合、memStoreは単一のプロセスからしか見えないため機能しません。

0
Tie Zhong