socket.io与pm2(cluster)集群搭配的解决方案(3)

服务端路由的前提仍然是需要针对每个ws服务器分配一个端口,只不过去掉nginx由服务端做ip hash。采用服务端路由架构清晰,而且实现容易,兼容性好。

上帝进程路由

此处的上帝进程即为主进程,类似pm2进程。上帝进程路由则是在上帝进程层面上做请求的定向分发,保证请求主机和进程的一致性。在上帝进程中,针对每个请求的ip做hash,并对每一个ws服务器创建单独的http服务器用于握手升级。

简易代码:

var express = require('express'), cluster = require('cluster'), net = require('net'), sio = require('socket.io'); var port = 3000, num_processes = require('os').cpus().length; if (cluster.isMaster) { var workers = []; var spawn = function(i) { workers[i] = cluster.fork(); workers[i].on('exit', function(code, signal) { console.log('respawning worker', i); spawn(i); }); }; for (var i = 0; i < num_processes; i++) { spawn(i); } // ip hash var worker_index = function(ip, len) { var s = ''; for (var i = 0, _len = ip.length; i < _len; i++) { if (!isNaN(ip[i])) { s += ip[i]; } } return Number(s) % len; }; var server = net.createServer({ pauseOnConnect: true }, function(connection) { var worker = workers[worker_index(connection.remoteAddress, num_processes)]; worker.send('sticky-session:connection', connection); }).listen(port); } else { // worker var app = new express(); // handshake server. var server = app.listen(0, 'localhost'), io = sio(server); process.on('message', function(message, connection) { if (message !== 'sticky-session:connection') { return; } server.emit('connection', connection); connection.resume(); }); }

总结

本文实现了三种解决方案,归根到底就是“ip hash”,不同点在于在请求处理的不同阶段做ip hash。

可以在请求处理最前端做iphash,即nginx方式,这也就是第一种方案;

可以在请求处理的第二层分发处做iphash,即上帝进程路由的方式,即第三种;

也可以在请求处理的终端做iphash,即服务端路由的方式,也就是第二种;

同时共享session也同样可以实现,借助socket.io-redis模块也可以实现。

好了,以上就是这篇文章的全部内容了,希望本文的内容对大家的学习或者工作能带来一定的帮助,如果有疑问大家可以留言交流,谢谢大家对脚本之家的支持。

您可能感兴趣的文章:

内容版权声明:除非注明,否则皆为本站原创文章。

转载注明出处:https://www.heiqu.com/wyxxpp.html