使用单个Dyno在Heroku上进行Node.js子进程处理

时间:2013-06-17 11:33:01

标签: node.js heroku

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

根据我的阅读,Heroku dyno是一个单一的网络流程,购买额外的dynos将允许您处理更多的流量,因为通过增加动态,你增加了你可以处理的请求数量的大小在任何时候。

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

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

或者我错了吗?

1 个答案:

答案 0 :(得分:9)

您对exec的理解大致是正确的,我关心的是您在不需要时使用它...在您的问题中,您只提及I / O类型的oeprations,哪个节点在其中处理非常有效服务的单线程事件模型。尽管是单线程,但事件模型允许代码在不阻塞主事件循环的情况下运行(除非你正在进行非常密集的CPU操作......,其中包括数据库请求,并且文件处理不包括在内)如上所述,你应该不需要发动额外的动态来做你想做的事。

将dyno视为单处理器计算机。无论你在拥有单一处理器的机器上做什么,你都可以在你的dyno上做,无需额外费用或创建动力。虽然,dyno的内存确实比单核处理器计算机可以利用的内存少得多。因此,您希望生成的任何子进程都不需要运行另一个dyno。您希望运行的每个主进程都需要自己的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中的很少事情表现得像第二个例子。如果你有一些适合第二个例子的东西,你可能最好选择一种不同的语言,而不是试图强迫节点为一个用例工作,它的设计非常糟糕。