しかし、そのコードで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セッションがワーカー間で共有されないことです。ロングポーリングトランスポートのいずれかを使用する場合、これはおそらく問題を意味します。