【问题标题】:Node.js child processes on Heroku with single DynoHeroku 上的 Node.js 子进程与单个 Dyno
【发布时间】:2013-06-13 08:18:32
【问题描述】:

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

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

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

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

还是我这一切都错了?

【问题讨论】:

  • 您不应该启动单独的节点进程来使数据库请求和文件处理异步发生......不必这样做是nodejs的好处。如果您产生不确定数量的工作“线程/进程”,那么您绝对是在错误地使用 NodeJS。有了这个答案,我相信你应该能够回答你自己的问题。如果您想了解更多详细信息,请告诉我!
  • 感谢您的回复,克里斯。我可能没有正确解释自己——我目前对 Node 的了解并没有超出 Node Beginner 书中详细介绍的内容,其中一个示例使用 var exec = require("child_process").exec;,然后在执行时使用 exec 函数用于演示非阻塞代码的昂贵的 shell 操作。因此,据我了解,在此示例中,shell 操作被推迟到另一个进程,以便主进程可以继续接受新请求,然后接收回调以显示初始请求的响应。
  • 我提交了我的 cmets 作为答案。

标签: node.js heroku


【解决方案1】:

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

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

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 中很少有东西表现得像第二个例子。如果您有适合第二个示例的内容,那么您最好选择一种不同的语言,而不是试图强制节点为它设计得很差的用例工作。

【讨论】:

  • 哦,好的。所以看来我误认为单线程单进程..?你知道我可以在一个测功机上运行的进程数量是否有限制吗?
  • 我强烈建议您不要启动大量进程。如果您认为您的节​​点进程需要为一个处理器启动超过 1 或 2 个工作程序,那么您可能没有正确使用节点,或者您的用例更适合不同的编程语言。我会为你写一个小演示代码。话虽如此,这个数字可能仅受 heroku 使用的任何操作系统的限制,而不是他们希望对您施加的任何限制。
  • 因此,您真正的限制可能是 RAM。 Dynos 可以支持 512MB 的内存(我上次检查过,这是不久前)。当您分叉一个进程时,该进程的内存会随身携带,并复制到它自己的环境中。所以假设一个 100MB 的进程,你可以产生 5 个这样的进程。 (这里的数学不太准确,这只是一个概述,可能需要进行基准测试)
  • 非常感谢代码示例。因此,假设第一台服务器将获取一些数据并使用这些数据向另一个缓慢的站点发出类似 curl 的请求,需要 3 秒才能响应,然后从该站点返回数据。这会阻塞,还是 Node 会自动以非阻塞方式处理?
  • 任何时候你在节点函数中看到一个回调函数的参数,这是一个不会阻塞事件循环的函数,并且会像第一个例子一样。一般来说,如果您使用节点库函数,您不必担心阻塞事件循环,并且应该将那段代码视为在它自己的线程上运行(这不一定是它实际工作的方式,但是如果你这样想的话,你会更容易理解,而不是试图理解 V8 对你的代码的真正作用)
猜你喜欢
  • 2013-06-28
  • 2017-05-23
  • 2019-04-05
  • 2016-02-26
  • 2012-07-02
  • 2012-03-08
  • 2015-01-05
  • 2011-01-16
  • 2017-06-04
相关资源
最近更新 更多