express框架和cluster模块融合
打算写个单机集群。 将http服务器的搭建当作master,将tcp服务器的搭建当作worker。 前台post数据到后台(master),master通过IPC将数据传给worker,worker最后将数据传给硬件设备。
cluster模块我是在/bin/www执行文件里面调用的。 这样的话好像必须要把所有的路由写在master里面,用来接收前台post数据,然后将数据传给worker。express的路由本来是放在routes/index.js里面,那我怎么才能把路由全部放到我的master进程里面呢?
这个是我bin/www执行文件。
var debug = require('debug')('Air:server');
var http = require('http');
//引入cluster模块
var cluster=require("cluster");
//create tcp Server.
var tcp=require("net").createServer();
if(cluster.isMaster){
/**
* Get port from environment and store in Express.
*/
var port = normalizePort(process.env.PORT || '3000');
app.set('port', port);
/**
* Create HTTP server.
*/
var server = http.createServer(app);
/**
* Listen on provided port, on all network interfaces.
*/
server.listen(port);
server.on('error', onError);
server.on('listening', onListening);
var wk=cluster.fork();
//监听fork事件
cluster.on("fork",function(worker){
console.log("[master]"+"fork:worker "+worker.id);
});
//监听online事件
cluster.on("online",function(worker){
console.log("[master]"+"listening:worker:"+worker.process.pid);
});
Object.keys(cluster.workers).forEach(function(id){
cluster.workers[id].on("message",function(msg){
console.log("[master]"+msg); //打印worker发送的数据
})
})
}else if(cluster.isWorker){
process.on("message",function(msg){
tcp.on("connection",function(socket){
socket.write("[From web Server]"+msg); //向硬件发送数据
socket.on("data",function(data){ //监听硬件发送数据
console.log("got data: "+data);
process.send("[woker]"+"can you hear me?"); //向master发送数据
})
})
})
tcp.listen(1337,function(){
console.log("TCP Server is on the port of 1337");
})
}
3 回复
@MiguelValentine 求指导
虽然不知道为什么点名我这个散人。。。 但是你的APP难道不是配置过ROUTER的express文件么。
楼主正好把逻辑写反了
cluster实现的多进程主要是2点
master进程负责fork出子进程 维护子进程的创建 销毁 重建 woker进程负责监听端口 处理请求
即 多个work可以监听同一端口 cluster会在更上一层分发请求到不同进程 具体为什么可以这样我也记不清了 重点在于worker进程是fork出来的 貌似和linux的进程管理特性有关
PS. 以经验来看 不建议使用cluster实现请求分发, 除非你的APP不需要cookie 不需要session