有关node.js的问题

我对node.js比较陌生 我有一个相关的问题。 据我了解,node.js使用事件驱动的范式,所以它只产生一个线程,并asynchronous处理所有事件(事件驱动的时尚)。 这有助于消耗更less的资源并处理大量的同时连接。

不过,我有一个相关的问题,因为它只有一个线程,即使一个单一的未处理的exception可能会崩溃一切都不是。 与像apache这样的node.js webserver不同,它可以使用多个进程来处理多个连接,即使一个进程崩溃也无所谓。

所以,我有点担心node.js是否有用。 我只是一个初学者。 所以任何见解都会有所帮助

我们用一个比喻来解释这个比较新颖的技术:一个电唱机和十个用户:

PHPmultithreading:10个唱片播放器,每个播放器有一个arm+针,每个用户有一个唱片播放器。 每个用户从他们自己的唱机播放一些音符。 未处理的exception,或嘶嘶声=logging播放器继续播放,直到用户举起arm/进程closures。 没有人能听到它,因为他们有自己的唱片播放器。 他们戴着耳机。

NodeJS:单线程

一个唱片播放器,有10个arm+针,每个用户一个,他们都分享那个唱片播放器。 每个用户同时访问一个快速的笔记,一个进程,logging。 这是asynchronous的,每个人都会得到一段音乐。 一个未处理的exception=一个用户的嘶嘶声,只有那些访问相同的几个音符,或相同的过程引发exception,也会听到嘶嘶声。 但是这是关于它的。 其他人仍然会听到甜美的音乐。 他们仍然有自己的耳机。

K.没有更糟糕的比喻。

下面是你的假设问题的解决scheme :在Node.js中,你可以附加一个监听器到`uncaughtException“事件,所以你可以杀死违规的进程,如果可能的话,甚至在罕见的情况下,可以closures服务器。

我使用群集来解决单线程的可靠性问题。 集群是内置库之一,您可以将其configuration为启动一个或(n)个工作者实例。 通常,为服务器中的每个CPU核心启动一个实例。 主进程监视工作进程中的事件(我不确定进程是否是100%正确的术语),并且可以捕获终止,logging它们,并重新启动工作程序。 理想情况下,您还将希望拥有多个位于不同区域的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); }