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’ }));

最后终于搞定希望对大家有所帮助 哈哈


12 回复

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 数据。RedisStoreconnect-redis 库提供的一个会话存储适配器,它将 Session 数据存储在 Redis 中。Redis 是一个高性能的内存数据库,可以非常方便地在多个进程中共享数据。

详细步骤

  1. 安装依赖

    npm install express express-session connect-redis redis
    
  2. 配置 Redis 存储

    • express-session 中设置 store 选项为 new RedisStore()
    • 配置 Redis 连接参数(如主机名、端口等),默认情况下,connect-redis 会尝试连接到本地运行的 Redis 服务器。
  3. 启动集群

    • 使用 cluster.fork() 方法启动多个子进程。
    • 通过监听 message 事件来处理子进程之间的通信。
  4. 测试 Session 共享

    • 访问应用的不同路径,检查 Session 数据是否正确更新并共享。

总结

通过使用 Redis 存储 Session 数据,我们可以有效地解决 Node.js 多进程环境下的 Session 共享问题。这种方式不仅提高了系统的性能,还确保了用户数据的一致性和可靠性。希望上述示例代码能帮助你更好地理解和实现多进程 Session 共享功能。


额。。

嗯…

代码样式..

有代码的话用 ``` 包围吧

请问怎么使用sqlserver保存session

不好意思,我没有那个环境,没有用过!!

共享的话肯定需要持久存储… npm 上面很多… mongo 存储 (npm mongo-session) 可以试试…

两个不同的app.js之间怎么用redis啊

redis是不错的多进程共享方案。其实如果session信息不多的话也可以考虑记cookie 自豪地采用 CNodeJS ionic

在使用 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

解释

  1. 主进程:创建多个工作进程。
  2. 子进程:使用 express-sessionconnect-redis 创建一个基于 Redis 的 session 存储。
  3. RedisStore:将 session 存储在 Redis 中,使得所有工作进程都可以访问相同的 session 数据。

这样配置后,所有工作进程都将共享同一个 session 数据库,解决了多进程之间 session 不共享的问题。

回到顶部