const cluster = require('cluster');
const http = require('http');
const numCPUs = require('os').cpus().length;
if (cluster.isMaster) {
console.log(`Master ${process.pid} is running`);
// Fork workers.
for (let i = 0; i < numCPUs; i++) {
cluster.fork();
}
cluster.on('exit', (worker, code, signal) => {
console.log(`worker ${worker.process.pid} died`);
});
} else {
// Workers can share any TCP connection
// In this case it is an HTTP server
var sticky = require('sticky-session');
var express = require('express');
var app = express();
app.get('/', function (req, res) {
console.log('worker: ' + cluster.worker.id);
res.send('Hello World!');
});
var server = http.createServer(app);
sticky.listen(server,3000);
console.log(`Worker ${process.pid} started`);
}
我查阅了有关 nodejs clustering and sticky-session 的文档以及关于此的另一个堆栈溢出答案
var cluster = require('cluster');
var http = require('http');
var sticky = require('sticky-session');
var express = require('express');
var app = express();
app.get('/', function (req, res) {
console.log('worker: ' + cluster.worker.id);
res.send('Hello World!');
});
var server = http.createServer(app);
sticky.listen(server,3000);
如果上面的代码片段在没有分叉的情况下运行,它可以正常工作,但如上面的集群示例所示,它永远不会工作,其中线程已启动但服务器从未初始化。
我读到有粘性集群的替代方案,有人可以就这个主题给出一个适当的权威答案,这对寻找相同的人很有用,另一个主要问题是 app.locals 对象,它用于存储变量一个应用程序实例和多个服务器实例的出现导致此中断,因为不同实例的值会有所不同,因此这种方法会导致一个大问题并且应用程序会中断。回答时请不要复制粘贴一些代码,请提供详细的答案,详细说明接近它的好处和缺点。
我不是在寻找仅限于使用sticky-sessions nodejs模块的答案,我欢迎使用处理器的所有内核并确保会话连续性的所有其他方法。
如果它涉及 RedisStore 或 MongoDb 存储就可以了,我想知道的是关于具有会话连续性的集群的 nodejs 应用程序的标准方法
https://github.com/indutny/sticky-session