6

我对 node.js 比较陌生。我有一个与之相关的问题。据我了解,node.js 使用事件驱动范式,因此它只产生一个线程并异步处理所有内容(事件驱动方式)。这有助于它消耗更少的资源并处理大量同时连接。

但是,我有一个与此相关的问题,因为它只有一个线程,即使是一个未处理的异常也可能使一切崩溃,不是吗。不像 apache 这样的 node.js 网络服务器可以使用多个进程来处理多个连接,即使一个进程崩溃也没关系。

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

4

2 回答 2

3

让我们用一个类比来解释这个相对较新的技术:一个唱机和十个用户:

PHP 多线程:10个唱机,每个唱机一个手臂+针,每个用户一个唱机。每个用户从他们自己的电唱机上播放几个音符。未处理的异常,或嘶嘶声 = 电唱机继续播放,直到用户抬起手臂/进程关闭。没有人能听到它,因为他们有自己的唱机。他们戴着耳机。

NodeJS:单线程

一台唱机,有 10 根手臂+针,每个用户一个,他们都共享那台唱机。每个用户同时访问一些快速的笔记,一个过程,不记录。它是异步的,每个人都得到一段音乐。一个未处理的异常 = 一个用户的嘶嘶声,只有那些访问相同的几个音符,或者抛出异常的相同进程也会听到嘶嘶声。但仅此而已。其他人仍然会听到甜美的音乐。他们仍然有自己的耳机。

K. 不要再做不好的类比了。

这是您假设问题的解决方案:在 Node.js 中,您可以将侦听器附加到“uncaughtException”事件。因此,如果有问题的进程会或可能在极少数情况下关闭服务器,则可以终止它。

于 2012-12-29T07:06:37.247 回答
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);
}
于 2012-12-29T21:01:29.827 回答