2016-10-11 60 views
0

我試圖創建工人,它工作正常。它有四個內核,多次嘗試時,它只顯示來自一名工作人員的消息。節點js集羣 - 它是如何工作的

var app = express(); 
app.use(express.static('public')); 
app.use(bodyParser.urlencoded({ extended: false })); 


if (cluster.isMaster) { 
    var cpuCount = os.cpus().length ; 
    console.log("No. of cpus:", cpuCount); 
    for(var i = 0; i < cpuCount; i++) cluster.fork(); 

    cluster.on('listening', function(worker, address) { 
     console.log('woker id:' + worker.id +' is now listening on port:' + address.port); 
    }); 
} else { 
    console.log("i'm a worker.. ... lets proceed"); 
    var server = app.listen(8082, function(req, res) { 

     var host = server.address().address; 
     var port = server.address().port; 
     request(i18n.__('url.config'), function(error, response, body){ 
      if (!error && response.statusCode == 200) { 
      } else { 
       console.log("Config error",error); 
      } 
     }); 
    }); // child process 

}// else 

//Listen for dying workers 
cluster.on('exit', function (worker) { 
    // Bring that ... ..er back 
    console.log('Worker %d died :', worker.id); 
    cluster.fork(); 
}); 

cluster.on('online', function (worker) { 
    // worker is alive 
    console.log('Worker %d is alive :', worker.id); 
}); 

app.get('/hey', function(req, res){ 
    console.log('Worker %d running!', cluster.worker.id); 
    res.send('Hello World from worker ' + cluster.worker.id); 
}); 

後來我修改了代碼來實例化並在worker(else循環)中創建表達對象的創建。輸出是一樣的。

if (cluster.isMaster) { 
    var cpuCount = os.cpus().length ; 
    console.log("No. of cpus:", cpuCount); 
    for(var i = 0; i < cpuCount; i++) cluster.fork(); 

    cluster.on('listening', function(worker, address) { 
     console.log('woker id:' + worker.id +' is now listening on port:' + address.port); 
    }); 
} else { 
    var app = express(); 

    console.log("i'm a worker.. ... lets proceed"); 
    var server = app.listen(8082, function(req, res) { 

     var host = server.address().address; 
     var port = server.address().port; 
     request(i18n.__('url.config'), function(error, response, body){ 
      if (!error && response.statusCode == 200) { 
      } else { 
       console.log("Config error",error); 
      } 
     }); 

     app.get('/hey', function(req, res){ 
      console.log('Worker %d running!', cluster.worker.id); 
      res.send('Hello World from worker ' + cluster.worker.id); 
     }); 
    }); // child process 

}// else 

節點--debug server.js

調試端口監聽5858

CPU的數目:4

調試器監聽端口5859

調試器聽在港口5860

調試器偵聽端口5861

調試端口監聽5862

我是一個工人......讓繼續

woker ID:1現在偵聽端口:8082

我是一個工人......讓繼續

我是一個工人......讓繼續

我是一個工人......讓繼續

woker ID:4現在監聽端口:8082

woker ID:3現在監聽端口:8082

woker ID:2現在監聽端口:8082

工2跑步!

工人2正在運行!

工人2正在運行!

工人2正在運行!

哪種工作者創作方式正確?自從它在港口收聽以來,在全球範圍內創建表達對象會造成任何問題?

回答

0

Node.js中的羣集允許您創建可以共享相同服務器端口的單獨進程。

當工作人員離開主進程時,它會從模塊的開頭重新運行代碼。所以它會創建Express應用程序,一個路線,然後監聽給定的端口。

但是工作人員之間的請求是如何分開的?顯然,他們不能(也不應該)都傾聽並回應我們得到的每一個請求。爲了解決這個問題,集羣模塊內部實際上有一個嵌入式負載均衡器,負責處理不同工作人員之間的分發請求。在Linux和OSX(但不是Windows)上,循環法(cluster.SCHED_RR)策略默認生效。

您可能還想知道不同的進程如何共享單個端口。運行這麼多處理網絡請求的進程的難點在於傳統上只有一個端口可以一次打開。羣集最大的好處就是它可以爲你處理端口共享,所以你所有的端口都可以被所有的孩子訪問,比如網絡服務器。這是通過IPC完成的,這意味着主人只是將端口句柄發送給每個工人。

cluster.fork()確實啓動了一個新的V8實例。

它應該謹慎使用。每個工作人員都佔用系統資源,因此只產生那些真正需要的資源。

這就是說,要回答你的問題,這兩種方法中的任何一種都可以。

由於fork創建一個新的實例,全局對象的創建不會產生影響。

下面的鏈接解釋了有關cluster.fork和child_process.fork https://millermedeiros.github.io/mdoc/examples/node_api/doc/cluster.html

+0

感謝,對xplanation和紐帶。 – Martin