繁体   English   中英

Cookie的粘滞socket.io会话,用于没有粘滞Express会话的node.js集群

[英]Sticky socket.io sessions by cookie for node.js cluster without sticky express sessions

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

  1. HTTP / S的传入连接应连接到任何单个工作进程
  2. WS / S的传入连接应基于cookie值连接到特定的工作程序-更广泛地说,基于值

有没有可用的库来实现我想要的行为? 如果没有,我应该如何完成这些行为?

您可以通过多种方式来执行此操作。 我将把您链接到本指南,介绍如何将Redis用作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的room函数可以完成您第二点要完成的工作,而不是依赖于创建新的工作程序任务。 不过那只是我的意见。

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM