2012-12-29 11 views
6

相關的擔憂,我比較新的到Node.js的我有一個相關的問題。據我瞭解,Node.js的使用事件驅動模式,所以它產生只有一個線程和處理一切異步(事件驅動的方式)。這有助於它消耗更少的資源並處理大量的同時連接。到Node.js的

不過,我有相關的一個問題,因爲它只有一個線程,甚至一個未處理的異常可能崩潰的一切是不是。與像Apache這樣的可以使用多個進程處理多個連接的node.js webserver不同,即使一個進程崩潰也沒有關係。

所以,我有點擔心的node.js是好了點。我只是一個初學者。因此,任何見解將是有益的

+3

http://nodejs.org/api/cluster.html – JohnnyHK

+0

我不明白爲什麼這個問題應該被關閉。任何親密的選民都在關心解釋嗎? – 2012-12-29 04:24:00

+0

+1 for @JohnnyHK - 集羣模塊爲您提供了一個小的「主」進程,它可以分派實際的Web應用程序處理的工作人員(通常等於CPU的數量)。然後,您會編寫一個小腳本來記錄和重新分配未處理錯誤的工作人員。下面是我寫的一個示例集羣包裝腳本(對不起,在CoffeeScript中,不是JS):https://gist.github.com/3656510 –

回答

3

讓我們用一個比喻來解釋這種相對新奇的技術:記錄玩家和十個用戶:

PHP多線程:10個電唱機,每個玩家都有一個ARM +針,每用戶有一臺唱機。每個用戶從他們自己的唱機播放幾張音符。未處理的異常,或嘶嘶聲=記錄播放器一直播放,直到用戶舉起手臂/過程關閉。沒有人能聽到它,因爲他們有自己的唱片播放器。他們戴着耳機。

的NodeJS:單線程

一個紀錄的球員,有10臂+針,每一個用戶,並且他們都共享一個電唱機。每個用戶可以同時訪問一個快速的幾個筆記,一個進程,從記錄中刪除。它是異步的,每個人都會得到一段音樂。一個未處理的異常=一個用戶的嘶嘶聲,只有那些訪問相同的幾個音符,或者引發異常的相同進程纔會聽到嘶嘶聲。但就是這樣。其他人仍然會聽到甜美的音樂。他們仍然有自己的耳機。

K.沒有更壞的比喻。

這裏的解決您的假設問題:在Node.js的,你可以附加一個監聽器`uncaughtException」事件所以,你可以,如果它會殺死有問題的過程中,或可能,在罕見的事件。 ,取下服務器

2

我使用Cluster來解決單線程可靠性問題Cluster是內置庫之一,您可以將其配置爲啓動一個或(n)個工作者實例。在服務器的每個CPU核心的一個實例。其主要過程監控從工作進程的事件(我不知道過程是100%正確的說法),並能抓住終端,記錄它們,而且比重啓ŧ他工人。理想情況下,您還將希望擁有多個位於不同區域的Web服務器和負載平衡器,可以監控您的Web服務器,檢測它們何時超載或未響應,並採取適當的措施(例如啓動新實例並殺死死亡的服務器)

典型代碼使用集羣看起來是這樣的(基於例如集羣文檔中):

var cluster = require('cluster'); 
var http = require('http'); 
var numCPUs = require('os').cpus().length; 

if (cluster.isMaster) { 
    // Fork workers. 
    for (var i = 0; i < numCPUs; i++) { 
     cluster.fork(); 
    } 
    cluster.on('exit', function(worker, code, signal) { 
     console.log('worker ' + worker.process.pid + ' died'); 
     // restart this instance 
     cluster.fork(); 
    }); 
} else { 
    // create an error handler for uncaught exceptions so we can log them 
    process.on('uncaughtException', function(err) { 
     var date = new Date(); 
     var message = date.toString() + ":UNCAUGHT EXCEPTION\n" + err.stack + "\n"; 
     console.log (message); 
     process.exit(1); // we will get restarted by the cluster process 
    }); 
    // Workers can share any TCP connection 
    // In this case its a HTTP server 
    http.createServer(function(req, res) { 
     res.writeHead(200); 
     res.end("hello world\n"); 
    }).listen(8000); 
} 
+0

一個很好的答案,和真正的工作解決方案。乾杯! – FredTheWebGuy