cluster用了 Sticky session以后进程之间事件通信失效了
发布于 8 年前 作者 yakczh 5286 次浏览 来自 分享

照着 https://github.com/indutny/sticky-session 这上面的例子写个测试代码

var cluster = require('cluster');  
var sticky = require('sticky-session');
const PORT=5000;
 
var totalReqs = 0;
var localReq = 0;

var server = require('http').createServer(function(req, res) {
      res.end(process.pid+ ' worker: ' + cluster.worker.id);
      process.send(" worker  " + process.pid + "  local is " + localReq + "  sum is " + totalReqs);
});

if (!sticky.listen(server, PORT)) {
  // Master code
 if (cluster.isMaster) {
	Object.keys(cluster.workers).forEach(function(i){
	    cluster.workers[i].on('message', function(msg) {
		    totalReqs++;
	            console.log(totalReqs);
	     });
	});
}
server.once('listening', function() {
    console.log('server started on  port',PORT);
  });
} else {
  // Worker code
console.log(process.pid);
}

sticky的效果实现了,但是master/woker进程之间事件通信没反应了

5 回复

这个session是用来干嘛的?如果是配置相关的,也不必如此

@i5ting socket.io 初始链接的时候是用的http短链接传sid 加了cluster以后 第一次发的短链接和第二次的握手链接 会分配到不同的进程 因为进程之间的数据是隔离的,所以sid对不上,就没法建立链接 用这个以后,ip跟进程绑定, 后面的请求都会发到 第一次链接分配的进程 这样sid就能取到了

@yakczh sid用redis去存,而非在cluster上做手脚,曾经有兄弟给我打过电话问这个

我记得express的connect-session中间件支持RedisStorage存储的,默认是MemoryStorage。我同意狼叔的建议。使用redis实现会话数据持久化与多进程间的会话数据共享 。

@yakczh 最终用的哪种方案?

回到顶部