express框架和cluster模块融合
发布于 13天前 作者 CommanderXL 162 次浏览 来自 问答

打算写个单机集群。 将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 回复

虽然不知道为什么点名我这个散人。。。 但是你的APP难道不是配置过ROUTER的express文件么。

楼主正好把逻辑写反了

cluster实现的多进程主要是2点

master进程负责fork出子进程 维护子进程的创建 销毁 重建 woker进程负责监听端口 处理请求

即 多个work可以监听同一端口 cluster会在更上一层分发请求到不同进程 具体为什么可以这样我也记不清了 重点在于worker进程是fork出来的 貌似和linux的进程管理特性有关

PS. 以经验来看 不建议使用cluster实现请求分发, 除非你的APP不需要cookie 不需要session

回到顶部