Как спроектировать redis pub/sub для системы обмена мгновенными сообщениями?

Я новичок в redis pub/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 создается глобально. И постоянно существует только три соединения, и это решает их проблему, потому что, когда издатель публикует сообщение, все подключенные клиенты должны его получить. Но у меня есть ограничение здесь. Я хочу открыть сеанс чата между двумя пользователями, и только эти пользователи должны быть подписчиками. Приведенный выше код работает так, как я хотел бы, но я не знаю, можно ли для Redis создавать новый клиент-подписчик для каждого подключения.

Было бы здорово услышать ваши предложения. Заранее спасибо.

14
задан Ali Ersöz 13 April 2012 в 13:59
поделиться