我不理解Node.js的架构。

7
我们正在考虑将node.js作为Web平台。但我有一个至关重要的问题,因为我认为我没有理解node.js的架构:
  1. 看起来默认情况下是被迫使用它们的自定义HTTP服务器,没有WSGI或其他?!

  2. 当在响应中进行一些“真正的计算”(不仅仅是一些I / O)时,似乎所有基础设施都会混乱,与例如Python - Pyramid / Flask等相比,每个请求的时间都会返回巨大的ab -n ... -c ... ?!

  3. 所以,node.js的作者认为我们只做I / O或我错过了一些非常基本的东西吗?


2
你应该了解一下http://en.wikipedia.org/wiki/Web_Server_Gateway_Interface。如果node.js使用它,我会有点担心。 - Kurt Spindler
1
@Kurt:我们对Python和node.js进行了基准测试。 - Cartesius00
1
将上述措辞与您下面的评论结合起来,似乎您只是在进行无意义的挑衅,利用这个“问题”来表达您的观点。 - Phrogz
1
@Phrogz 不是的,我只是在寻找答案,如何让node.js以最自然的方式使用我们服务器上的所有16个核心,如果我们的任务不仅是I/O绑定的话。 - Cartesius00
@James更新了我的答案,以特别回应最新的评论。 - Domenic
我修改了这个问题的标题,使其不那么像恶作剧。 - Domenic
3个回答

16
  1. 您自相矛盾:“默认情况下”和“强制执行”是不兼容的。您可以使用任何HTTP库。核心http模块可以被视为“默认”,但没有什么可以阻止您使用另一个。

  2. JavaScript是单线程语言,Node.js是JavaScript运行时,而不是像许多其他Web服务器一样为每个响应生成一个线程的Web服务器。如果您想要为每个响应启动一个线程,您仍然可以这样做,并且有一些在Node之上构建的项目可以实现此功能,但是您会失去大部分Node的优势。如果您正在响应Web请求时进行计算密集型工作(并且您有愿意等待您完成它的客户端),则应通过许多可用解决方案之一(Web Workers、Threads-a-go-go、Child_process等)启动单独的线程。

  3. Node.js的作者认为您正在编写Web服务器。您在Web服务器中执行的大多数操作本质上都是IO,无论该IO涉及文件系统、数据库还是甚至用于将计算密集型任务排队到其他工作进程的消息总线。

从您的问题来看,如果您试图将Node.js与Python和WSGI集成,则似乎存在基本误解。Node.js用于编写Web服务器,因此尝试将其与Python一起使用...在Python中?(我真的不确定您要实现什么)没有多大意义。

如果您的任务不仅受I/O限制,那么您可能不应该在同一台机器上托管这些任务。因此,在3中简要提到的消息总线方法非常相关。但是,如果您决定这样做,并且确信这些任务不会占用所有CPU,则应确定此类任务出现的频率。如果它们在每个Web请求上都存在,则不应使用Node.js;您正在放弃其最基本的优势,仅剩下次要优势(如围绕它发展的生态系统)。如果它们很少见,则应通过2中的许多方法将它们分开成单独的线程。

相关:https://gist.github.com/2794861


在第三点上,node.js的概念确实无法很好地处理CPU密集型子任务。好的。 - Cartesius00
不仅仅是Node.js,而是JavaScript的整体。 - Domenic
2
啊,好的,听起来你似乎在尝试使用WSGI和Node,但这是没有意义的(正如@Kurt Spindler所指出的)。 - Domenic
我猜你在第二点上是错误的,node.js有一些内部HTTP服务器(哦天啊...又来一个),我看不出这个HTTP服务器为什么不能是多线程的。 - Cartesius00
6
在第二部分中,我说过Node不是一个会生成每个响应线程的Web服务器。它不支持多线程是因为异步IO具有许多优势。每个响应线程过于笨重。集群API用于计算密集型任务,而不是为每个HTTP请求创建新线程(这非常愚蠢)。 - Domenic
显示剩余2条评论

3
如果你使用Python,你可能还想考虑Twisted,它是一个用Python编写的事件驱动框架。Twisted还能将长时间运行的阻塞工作推迟到线程中。
最重要的是,你首先需要定义你的需求和问题。不要仅仅因为大家都在谈论它而盲目追逐新潮事物。看看你的需求并使用适合解决它们的工具。

0

我看到有一个基于WSGI的node.js模块:Strata

此外,您可以将密集计算卸载到子进程中:Child Process


2
分叉是一种可怕的操作,如果子进程意味着进程,例如在Linux上。 - Cartesius00
2
是的,它表示一个子进程。您的密集计算有多密集?它足以损害您的单线程性能,但fork成本仍然相对较大,以至于对您构成问题吗? - lanzz
1
想象一下每秒1000个请求,你有两个拥有6个核心的CPU,因此我们自然希望使用所有的CPU来解决问题。我的意思是,自然而然地——没有代理或代理的情况。 - Cartesius00
1
你可能想看一下这个:http://nodejs.org/api/cluster.html在6核机器上可以运行6个node.js进程,并且它们将共享HTTP监听器;虽然这是一个实验性的扩展,但我不知道它如何在进程之间平衡请求。此外,我发现你可以将其作为类似FastCGI的服务器运行:http://search.npmjs.org/#/NodeCGI或者你可以组合一些长期运行的计算子进程和一些协议来与它们通信。你有太具体的要求,不能期望一个开箱即用的解决方案。 - lanzz
1
@lanzz 我相信负载均衡是由内核随机完成的。https://groups.google.com/d/msg/nodejs/s04AKMHYTEA/5xEdFKjkIG0J - Farid Nouri Neshat

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接