美文网首页
node 多进程与session共享

node 多进程与session共享

作者: 雪承 | 来源:发表于2016-04-26 22:59 被阅读0次

    一、Node如何开启多进程

    cluster是一个nodejs内置的模块,用于nodejs多核处理。cluster模块,可以帮助我们简化多进程并行化程序的开发难度,轻松构建一个用于负载均衡的集群。

    我的系统环境:

    • OS X Yosemite 10.10.5
    • node V4.4.3
    • npm V2.15.1

    1. cluster 示例

    新建文件夹

    $ mkdir test_cluster && cd test_cluster
    

    创建app.js

    $ vim app.js
    
    var cluster =require('cluster');
    var http =require('http');
    var processes = 4;
    if(cluster.isMaster) {
      console.log("master start...");
      //Fork workers.
      for(var i =0; i < processes; i++) {
        cluster.fork();
      }
      cluster.on('listening',function(worker,address){
        console.log('listening: worker '+ worker.process.pid);
      });
      cluster.on('exit', function(worker, code, signal) {
        console.log('worker '+ worker.process.pid +' died');
      });
    }else{
      http.createServer(function(req, res) {
        res.writeHead(200);
        res.end("server start!");
      }).listen(3000);
    }
    
    $ node app.js
    

    控制台打印:

    master start...
    listening: worker 92753
    listening: worker 92754
    listening: worker 92755
    listening: worker 92756
    

    2.cluster API

    cluster对象的各种属性和函数
    cluster.setttings:配置集群参数对象
    cluster.isMaster:判断是不是master节点
    cluster.isWorker:判断是不是worker节点
    Event: 'fork': 监听创建worker进程事件
    Event: 'online': 监听worker创建成功事件
    Event: 'listening': 监听worker向master状态事件
    Event: 'disconnect': 监听worker断线事件
    Event: 'exit': 监听worker退出事件
    Event: 'setup': 监听setupMaster事件
    cluster.setupMaster([settings]): 设置集群参数
    cluster.fork([env]): 创建worker进程
    cluster.disconnect([callback]): 关闭worket进程
    cluster.worker: 获得当前的worker对象
    cluster.workers: 获得集群中所有存活的worker对象

    worker对象的各种属性和函数:可以通过cluster.workers, cluster.worket获得。
    worker.id: 进程ID号
    worker.process: ChildProcess对象
    worker.suicide: 在disconnect()后,判断worker是否自杀
    worker.send(message, [sendHandle]): master给worker发送消息。注:worker给发master发送消息要用process.send(message)
    worker.kill([signal='SIGTERM']): 杀死指定的worker,别名destory()
    worker.disconnect(): 断开worker连接,让worker自杀
    Event: 'message': 监听master和worker的message事件
    Event: 'online': 监听指定的worker创建成功事件
    Event: 'listening': 监听master向worker状态事件
    Event: 'disconnect': 监听worker断线事件
    Event: 'exit': 监听worker退出事件

    二、多进程间如何共享session

    关于session共享有这么几种做法:
    进程通信、redis存储、本地mongodb存储、数据库存储。
    本篇使用的是redis来存储session,node提供了connect-redis模块用来连接redis数据库。

    var express = require('express');
    var session = require('express-session');
    var RedisStore=require('connect-redis')(session);
    var app = express();
    
    // 本地redis配置参数
    var options = {
      host:'127.0.0.1',
      port:'6379',
      db:0
    };
    
    app.use(session({
      secret: 'secret-string',
      saveUninitialized:true,
      resave:false,
      store:newRedisStore(options)
    }));
    
    app.get("/", function(req, res) {
      var session = req.session;session.count = session.count ||0;
      var n = session.count++;
      res.send('hello, session id:'+ session.id +' count:'+ n);
    });
    
    app.listen(3000);
    

    通过应用redis就可以保证各进程使用的session是一致的了。即使进程崩溃也能保证用户的登录状态不会丢失。

    相关文章

      网友评论

          本文标题:node 多进程与session共享

          本文链接:https://www.haomeiwen.com/subject/muqcrttx.html