nodeマルチプロセスとsession共有

3102 ワード

一、Nodeはどうやってマルチプロセスを開けますか?
clusterはnodejs内蔵のモジュールで、nodejs多核処理に用いられます.clusterモジュールは、多プロセス並列化プログラムの開発難易度を簡略化し、負荷バランスのためのクラスタを容易に構築することができます.
私のシステム環境:
  • OS X Yosemite 10.5
  • node V 4.4.3
  • npm V 2.5.1
  • 1.clusterの例
    新規フォルダ
    $ mkdir test_cluster && cd test_cluster
    
    ap.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.settings:クラスタパラメータオブジェクトを配置するcluster.ismaster:masterノードcluster.isWorkerかどうかを判断する:workノードEvent:'fork':work作成プロセスイベントを傍受するEvent:'online':work作成成功イベントEventを傍受するker断線イベントEvent:''exit':work退出イベントEvent:'setup':setup Masterイベントcluster.setupMaster([setupMaster]):クラスタパラメータcluster.fork(env):workerプロセスを作成するcluster.disconct(calback)を取得するオブジェクト:clterwork
    workerオブジェクトの各種属性と関数:cluster.workersにより、cluster.worketが得られます.worket.id:プロセスID番号worker.process:ChildProcessオブジェクトworker.suicide:disconnect()の後、workerが自殺したかどうかを判断するworker.send:masterがworkerにメッセージを送る.注:workerはmasterにメッセージを送ります.process.send worker.kill([signal='SIGTRERM]):指定されたworkerを殺します.別名destory()worker.disconnect():workerを切断します.workerを自殺させるEvent:'message':mastersとworkerのmessageイベントEvent:'online':指定されたworker作成成功イベントを傍受するEvent:'listening':masteningを傍受します.masteraがworker状態イベントイベントEvent:'disconnect'を傍受します.
    二、マルチプロセス間で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を適用することで、各プロセスのセッションが一致することが保証されます.プロセスが崩壊しても、ユーザのログイン状態が失われないことが保証されます.