在单独的nodeJS实例上共享套接字

时间:2015-01-20 16:35:19

标签: node.js sockets redis socket.io scalability

我正在使用多个聊天服务器(nodeJS)和一个redis服务器进行聊天应用程序,这应该有助于对所有nodeJS实例进行分组。好吧,我有这个:

var io = require('socket.io').listen(3000);

// Create a Redis client
var redis  = require('redis');
client = redis.createClient(6379, '54.154.149.***', {});

// Check if redis is running
var redisIsReady = false;
client.on('error', function(err) {
    redisIsReady = false;
    console.log('redis is not running');
    console.log(err);
});
client.on('ready', function() {
    redisIsReady = true;
    console.log('redis is running');
});


io.sockets.on('connection', function(socket){
    socket.on('new user', function(data){
            client.set('user:' + data, socket.id);
    })

    socket.on('send message', function(data){
        client.get('user:' + data['id'], function (err, socketId) {
            io.sockets.connected[socketId].emit('new message',data['msg']);
        });
    })

    socket.on('disconnect', function(data){

    });
});

redis工作正常,如果我在同一台服务器上有两个用户,他们可以聊天。但是如果它们位于不同的服务器上,则它们不能,因为服务器之间不共享套接字。我该如何解决这个问题?我在redis上查看了pub / sub,我确信这是答案,但我没有设法实现它。

1 个答案:

答案 0 :(得分:3)

Socket.IO文档有一个关于doing sticky sessions and distributing messages的部分。但快速回答是使用像socket.io-redis这样的模块。