Heroku 上的 Node.js 子进程与单个 Dyno

标签 node.js heroku

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

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

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

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

还是我这一切都错了?

最佳答案

您对 exec 的理解大致正确,我担心的是您在不需要时使用它...在您的问题中,您只提到了操作的 I/O 类型,哪个 Node 在其中非常有效地处理它单线程事件模型的处事。尽管是单线程的,但事件模型允许代码在不阻塞主事件循环的情况下运行(除非您正在执行非常 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 中很少有东西表现得像第二个例子。如果您有适合第二个示例的内容,那么您最好选择一种不同的语言,而不是试图强制 Node 为它设计得很差的用例工作。

关于Heroku 上的 Node.js 子进程与单个 Dyno,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/17146491/

相关文章:

node.js - 使用 get 函数从 Solidity 结构接收 JSON [Express]

node.js - Node 中的异步uuid生成

Heroku 和 GoDaddy DNS 配置

node.js - 赫罗库; “No such process type web defined in Procfile” 错误

heroku - Amazon EC2 实例和 heroku 之间的安全设置

ruby-on-rails - 为什么在使用 rake 调用 heroku toolbelt CLI 时会出现 RubyVersionMismatch?

node.js - 如何配置 Nginx 和 Node 以使用 SSL?

javascript - 如何检查 div 是否包含某个单词并检查该单词是否与 var 匹配?

javascript - 具有多个请求的 Express.js (Node.js) 中的 ECONNRESET

ruby-on-rails - 在 Heroku 上强制执行文件上传大小?