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の例
新規フォルダ
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データベースを接続します.
clusterはnodejs内蔵のモジュールで、nodejs多核処理に用いられます.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 APIclusterオブジェクトの各種属性と関数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を適用することで、各プロセスのセッションが一致することが保証されます.プロセスが崩壊しても、ユーザのログイン状態が失われないことが保証されます.