私はredispub/subを初めて使用します。システムにIMのようなチャット機能があります。そこで、redis pub/subを使用したいと思います。私がサンプルを調べたので、それらのほとんどはチャットルームに基づいて設計されています。私のシステムでは、次のようなユーザー間に複数のチャットルームがあります。
A:B
A:C
D:C
E:F
つまり、上の行は部屋です。そして、私は以下のようにnode.jsでサーバーを実装しました。
var store = redis.createClient();
var pub = redis.createClient();
io.sockets.on('connection', function (socket) {
var sub = redis.createClient();
sub.on("message", function(pattern, data){
data = JSON.parse(data);
socket.send(JSON.stringify({ type: "chat", key: pattern, nick: data.nickname, message: data.text }))
}
});
socket.on('message', function (messageData) {
store.incr("messageNextId", function(e, messageId) {
var room = ""
var from = messageData.clientId > socket.nickname ? socket.nickname : messageData.clientId;
var to = messageData.clientId < socket.nickname ? socket.nickname : messageData.clientId;
room = from + ":" + to;
var message = { id: messageId, nickname: socket.nickname, text: messageData.text };
store.rpush("rooms:" + room, JSON.stringify(message), function(e, r) {
pub.publish(room, JSON.stringify(message))
});
});
});
ご覧のとおり、接続ごとに新しいredisサブスクライバーを作成しています。他のチャットルームのサンプルでは、redisサブスクライバークライアントがグローバルに作成されます。また、接続は常に3つしかないため、発行者がメッセージを公開すると、接続されているすべてのクライアントがメッセージを取得する必要があるため、問題が解決します。しかし、ここには制約があります。2人のユーザー間でチャットセッションを開きたいのですが、これらのユーザーだけがサブスクライバーになる必要があります。上記のコードは私が望むように機能しますが、redisが接続ごとに新しいサブスクライバークライアントを作成してもよいかどうかはわかりません。
あなたの提案を聞くのは素晴らしいことです。前もって感謝します。