【发布时间】:2018-12-20 10:02:30
【问题描述】:
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 集群和粘性会话的文档 以及关于此的另一个堆栈溢出答案
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);
如果上面的 sn-p 在没有分叉的情况下运行,它可以正常工作,但不会像上面集群示例中所示的那样工作,其中线程已启动但服务器从未初始化。
我读到有粘性集群的替代方案,有人可以就这个主题给出适当的权威答案,这对于寻找相同主题的人很有用,另一个主要问题是 app.locals 对象,它用于为应用程序实例存储变量,并且多个服务器实例的出现导致此中断,因为不同实例的值会有所不同,因此这种方法会导致一个大问题并且应用程序会中断。回答时请不要复制粘贴一些代码,请提供详细信息回答详细说明该方法的优点和缺点。
我不是在寻找仅限于使用 sticky-sessions nodejs 模块的答案,我欢迎使用处理器的所有内核并确保会话连续性的所有其他方法。
如果它涉及 RedisStore 或 MongoDb 存储,我想知道的是关于具有会话连续性的集群的 nodejs 应用程序的标准方法
https://github.com/indutny/sticky-session
【问题讨论】:
-
我真的不知道答案,但尝试移动 var sticky = require('sticky-session');到代码的开头,因此它们都使用相同的会话。
-
不,它没有帮助
标签: node.js node-cluster sticky-session