如果应用程序使用群集并在不同端口上的多个进程中运行,如何使用socket.io将消息发送到特定客户端?

时间:2016-07-29 09:26:06

标签: node.js socket.io

应用程序以集群模式启动,每个worker都使用redis adapter建立与套接字的连接:

app.set('port', httpPort);
    let server = http.createServer(app);
    let io = require('./socketServer')(server);
    io.adapter(redis({host: host, port: port}));
app.set('io', io);

然后我们连接主socket.io文件(socketServer),在socket授权和on.connection事件之后,我们将sessionID保存在变量socketID中,并将当前套接字连接存储在数组io.clients

io.sockets.on('connection', (socket) =>{
        var socketID = socket.handshake.user.sid;     
        io.clients[socketID] = socket;
        io.clients[socketID].broadcast.emit('loggedIn',socket.handshake.user.data);

        socket.on('disconnect', () =>{
            delete io.clients[socketID];
        });
});

在nodejs应用程序之前,我们有自定义“上游”的nginx来组织“粘性会话”(http://socket.io/docs/using-multiple-nodes/#nginx-configuration)。 然后,当我们想要向特定客户发送消息时,我们已经从控制器获取id用户,并获取id的session-id(我们预先授权将这些对应关系保存在redis中),然后只发送一条消息:< / p>

this.redis.getByMask(`sid_clients:*`,(err,rdbData) =>{
            Async.each(clients,(client,next)=>{
                let sid = `sid_clients:${client}`;
                let currentClient = rdbData[sid];
                if(!currentClient || !this.io.clients[currentClient]) return next();
                this.io.clients[currentClient].emit(event,data);
                return next();
});

当我们在一个进程中运行应用程序时,它工作正常。但是在群集模式下运行时这不起作用。连接消息“loggedIn”将发送给所有进程的所有客户。但是,如果将一个消息发送到连接到另一个进程中的服务器的客户端的单个进程不起作用,因为每个进程都有自己的数组io.clients并且它们总是具有不同的内容,所以消息不会可以找到合适的客户。

那么,如何以群集模式将事件发送到特定客户端?如何将所有连接的插座保持在一个地方以避免像我这样的情况?

0 个答案:

没有答案