Nodejs 多进程 Session 共享问题探讨
Nodejs 多进程 Session 共享问题探讨
nodejs 用 cluster 模块实现多进程 启动,刚开始 心喜
if (cluster.isMaster) {
var numCPUs = require(‘os’).cpus().length;
var data = 0;
// 启动多个进程.
for (var i = 0; i < numCPUs; i++) {
//增加一个进程
var worker_process = cluster.fork();
//侦听子进程的message事件
worker_process.on(‘message’, function(msg) {
if (msg.cmd && msg.cmd == ‘notifyRequest’) {
data++;
console.log('DATA VALUE : %d ', data);
}
});
}
} else {
process.send({ cmd: ‘notifyRequest’ });
http.createServer(app).listen(app.get(‘port’), function () {
console.log("Web server listening on port " + app.get(‘port’));
});
}
多进程起动 参考官网代码
因为 Session 无法 在多进程 之间共享的问题,造成系统Session登录后台无法 共享
后台经过 google baidu 终于 找到了解决办法
把 Session 用 redis 来存储
var RedisStore = require('connect-redis')(express);
app.use(express.session({
secret:‘xxz’,
store:new RedisStore(),
key:‘express.sid’
}));
最后终于搞定希望对大家有所帮助 哈哈
Nodejs 多进程 Session 共享问题探讨
背景介绍
在使用 Node.js 开发高并发应用时,通常会考虑使用 cluster
模块来利用多核 CPU 的优势。通过 cluster
模块可以轻松地启动多个子进程来处理请求,从而提高系统的吞吐量和响应速度。然而,随之而来的一个问题是:如何在多进程间共享 Session 数据?
示例代码
首先,我们来看一下如何使用 cluster
模块启动多个子进程:
const cluster = require('cluster');
const os = require('os');
if (cluster.isMaster) {
const numCPUs = os.cpus().length;
for (let i = 0; i < numCPUs; i++) {
cluster.fork();
}
// 监听所有子进程的消息
cluster.on('message', (worker, message) => {
if (message.cmd && message.cmd === 'notifyRequest') {
console.log(`Worker ${worker.id} received a request.`);
}
});
} else {
process.send({ cmd: 'notifyRequest' });
const express = require('express');
const session = require('express-session');
const RedisStore = require('connect-redis')(session);
const app = express();
app.use(session({
store: new RedisStore(),
secret: 'your-secret-key',
resave: false,
saveUninitialized: false,
cookie: { secure: false } // 如果使用 HTTPS,应设为 true
}));
app.get('/', (req, res) => {
let count = req.session.count || 0;
req.session.count = ++count;
res.send(`You have visited this page ${count} times`);
});
app.listen(3000, () => {
console.log('Server is running on port 3000');
});
}
解决方案
在上面的代码中,我们使用了 RedisStore
来存储 Session 数据。RedisStore
是 connect-redis
库提供的一个会话存储适配器,它将 Session 数据存储在 Redis 中。Redis 是一个高性能的内存数据库,可以非常方便地在多个进程中共享数据。
详细步骤
-
安装依赖:
npm install express express-session connect-redis redis
-
配置 Redis 存储:
- 在
express-session
中设置store
选项为new RedisStore()
。 - 配置 Redis 连接参数(如主机名、端口等),默认情况下,
connect-redis
会尝试连接到本地运行的 Redis 服务器。
- 在
-
启动集群:
- 使用
cluster.fork()
方法启动多个子进程。 - 通过监听
message
事件来处理子进程之间的通信。
- 使用
-
测试 Session 共享:
- 访问应用的不同路径,检查 Session 数据是否正确更新并共享。
总结
通过使用 Redis 存储 Session 数据,我们可以有效地解决 Node.js 多进程环境下的 Session 共享问题。这种方式不仅提高了系统的性能,还确保了用户数据的一致性和可靠性。希望上述示例代码能帮助你更好地理解和实现多进程 Session 共享功能。
额。。
嗯…
代码样式..
有代码的话用 ``` 包围吧
请问怎么使用sqlserver保存session
不好意思,我没有那个环境,没有用过!!
共享的话肯定需要持久存储… npm 上面很多… mongo 存储 (npm mongo-session) 可以试试…
具体例子可以看这里 https://github.com/rajaraodv/redispubsub
两个不同的app.js之间怎么用redis啊
redis是不错的多进程共享方案。其实如果session信息不多的话也可以考虑记cookie 自豪地采用 CNodeJS ionic
mark
在使用 Node.js 的 cluster
模块实现多进程时,会遇到 session 共享的问题。默认情况下,每个工作进程(worker)都有自己的内存空间,因此它们之间的 session 数据不会共享。为了解决这个问题,可以使用 Redis 存储 session 数据。
以下是一个示例代码,展示了如何使用 Redis 来共享 session 数据:
主进程代码
const cluster = require('cluster');
const os = require('os');
const express = require('express');
const session = require('express-session');
const RedisStore = require('connect-redis')(session);
if (cluster.isMaster) {
const numCPUs = os.cpus().length;
for (let i = 0; i < numCPUs; i++) {
cluster.fork();
}
// 监听子进程的消息
cluster.on('exit', (worker, code, signal) => {
console.log(`Worker ${worker.process.pid} died`);
});
} else {
// 子进程代码
const app = express();
app.use(session({
store: new RedisStore(),
secret: 'your_secret_key',
resave: false,
saveUninitialized: false
}));
app.get('/', (req, res) => {
let count = req.session.count || 0;
req.session.count = ++count;
res.send(`You have visited this page ${count} times`);
});
app.listen(3000, () => {
console.log('Server running on port 3000');
});
}
Redis 配置
确保你已经安装了 Redis 并且运行在本地或者指定的地址上。你可以通过以下命令安装 Redis:
sudo apt-get install redis-server
安装依赖
确保安装了所需的依赖包:
npm install express express-session connect-redis redis
解释
- 主进程:创建多个工作进程。
- 子进程:使用
express-session
和connect-redis
创建一个基于 Redis 的 session 存储。 - RedisStore:将 session 存储在 Redis 中,使得所有工作进程都可以访问相同的 session 数据。
这样配置后,所有工作进程都将共享同一个 session 数据库,解决了多进程之间 session 不共享的问题。