通过cookie为node.js集群粘贴socket.io会话而没有粘性快速会话

时间:2015-09-04 21:38:48

标签: node.js express socket.io load-balancing

我正在使用相同服务器上的expresssocket.io Node.js库,聆听相同端口。我想使用cluster模块来支持循环负载平衡,但我希望expresssocket.io的负载平衡行为不同。行为如下:

  1. HTTP / S的传入连接应连接到任何单个工作程序
  2. WS / S的传入连接应根据 cookie值连接到特定的工作人员---更广泛地说,基于值
  3. 是否有可用的库来完成我想要的行为?如果没有,我该怎么做才能完成这些行为?

1 个答案:

答案 0 :(得分:0)

有很多方法可以做到这一点。我要把你链接到this guide on using redis as a pub sub,但我也会给你一个简短的概述,看看它是什么样的。

因此在启动时产生两个集群,或者你想要多少集群......

var aWorker = cluster.fork();
var bWorker = cluster.fork();

然后你需要将它们设置为侦听各自的端口,所以使用net模块:

var server1 = require('net').createServer([options], function( connection ) {
    aWorker.send( 'ConnectionEvent' , connection );
}).listen(80); //HTTP/WS
var server2 = require('net').createServer([options], function( connection ) {
    bWorker.send( 'ConnectionEvent' , connection );
}).listen(443); //HTTPS/WSS

在您的群集流程中:

var app_server = require('express')().listen( 0, 'localhost' );
var io = require('socket.io')(app_server);
io.adapter(require('socket.io-redis')({ host: '127.0.0.1', port: **REDIS PORT** });
io.on('connection', function (socket) {
    //Rest of your io server code
...

process.on( 'message' , function( message, connection ) {
    if( connection && message === 'ConnectionEvent' ) {
        app_server.emit( 'connection', connection );
        connection.resume();
    }
}

我相信Socket.io的房间功能可以完成你在第二点尝试做的事情,而不是依赖于创建新的工作任务。这只是我的看法。