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

Node.js child processes on Heroku with single Dyno

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

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

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

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

或者我错了吗?


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

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

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
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
');
}).listen(1337, '127.0.0.1');

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