15

请原谅我的无知,我目前正在学习如何使用来自 PHP 背景的 Node,我真的没有与 Apache 或服务器管理交互。我使用 Heroku 来托管我的 Node 项目,直接从 Cloud9 IDE 推送。

根据我的阅读,Heroku dyno 是一个单一的 Web 进程,购买额外的 dyno 可以让您处理更多的流量,因为通过增加 dyno 可以增加您可以在任何一个处处理的请求量的大小时间。

我知道 Node 是一个单线程系统,它一个一个地处理请求,允许您为可能需要一些时间来处理的任何事情(如数据库请求、处理文件等)生成子进程。

那么如果我用一个测功机生成一个子进程,Heroku 会发生什么?这不需要另一个测功机来工作吗?当然,如果 Node 正在运行一个进程并且我的单个测功机中只有一个进程可用,那么任何额外的进程也必须由该进程处理吗?

还是我错了?

4

1 回答 1

9

您对 exec 的理解大致正确,我担心的是您在不需要时使用它...在您的问题中,您只提到了 I/O 类型的操作,哪个节点在其单线程事件中非常有效地处理做事的典范。尽管是单线程的,但事件模型允许代码在不阻塞主事件循环的情况下运行(除非您正在执行非常 CPU 密集型操作......,其中不包括数据库请求和文件处理)话虽如此,您应该不需要启动额外的测功机来做你想做的事。

将测功机视为单处理器计算机。无论您可以在具有单个处理器的机器上做什么,您都可以在您的测功机上执行任何操作,无需额外费用或创建测功机。但是,测功机的内存确实比单核处理器计算机可以利用的内存少得多。因此,您希望生成的任何子进程都不需要另一个 dyno 来运行。您希望运行的每个主进程都需要自己的测功机。

var http = require('http');

http.createServer(function (req, res) {

    res.writeHead(200, {'Content-Type': 'text/plain'});
    res.end('An amount of data that will take 1 second to send');//This will not block the event loop
}).listen(1337, '127.0.0.1');

var http = require('http');
http.createServer(function (req, res) {

    while(true) {
         break after 1 second; //this will block the event loop for 1 second
    }

    res.writeHead(200, {'Content-Type': 'text/plain'});
    res.end('Hello World\n');
}).listen(1337, '127.0.0.1');

考虑上面代码中的两个服务器。两台服务器都有大约一秒钟的工作要做。第一个示例每秒可以处理数千个请求,第二个示例只有 1. 发送数据、数据库请求、服务器请求、文件 IO 等......所有的行为都与第一个示例一样...... Node 中很少有东西表现得像第二个例子。如果你有适合第二个例子的东西,你可能最好选择一种不同的语言,而不是试图强制节点为它设计得很糟糕的用例工作。

于 2013-06-17T14:07:00.700 回答