我不理解Node.js架构

2024-05-18 00:49:09 发布

您现在位置:Python中文网/ 问答频道 /正文

我们正在考虑将node.js作为一个web平台。但我有一个关键的问题,因为我认为我不了解node.js的体系结构:

  1. 默认情况下,你不得不使用他们的自定义HTTP服务器,而不是WSGI或其他什么东西?!

  2. 看起来,当在响应中进行一些“真正的计算”(不仅是一些I/O)时,所有的基础设施都被搞得一团糟,ab -n ... -c ...与Python(金字塔/烧瓶)或其他什么东西相比,每个请求都会返回大量的时间?!

  3. 因此,node.js的作者假设我们只做I/O,或者我遗漏了一些非常基本的东西?


Tags: 服务器webnodehttpwsgiab烧瓶体系结构
3条回答
  1. 你自相矛盾:“默认”和“强制”是不相容的。你可以使用任何你想要的HTTP库。核心http模块可能被认为是一个“默认”模块,但是没有什么可以阻止您使用另一个模块。

  2. JavaScript是一种单线程语言,Node.js是一个JavaScript运行时,而不是像其他许多服务器一样为每个响应生成一个线程的web服务器。如果需要,您仍然可以为每个响应执行一个线程,并且有一些项目构建在节点之上,可以执行此操作,但是您失去了节点的大部分好处。如果您正在响应web请求而执行计算繁重的工作(并且您有愿意等待您执行该操作的客户机),那么您应该通过许多可用解决方案(web工作者、threads-a-go-go、child-u进程等)中的一个分离线程。

  3. Node.js的作者假设您正在编写一个web服务器。在web服务器中所做的大多数事情本质上都是IO,无论该IO是否涉及文件系统、数据库,甚至是用于在其他工作区进程上对计算密集型任务进行排队的消息总线。

回顾一下您的问题,如果您试图将Node.js与Python和WSGI集成,您似乎对Node.js是什么有一个基本的误解。js用于编写web服务器,因此尝试使用它。。。和Python一起?在Python体内?(我真的不知道你想完成什么)没什么意义。

如果您的任务不仅是I/O绑定的,那么您可能不应该将这些任务托管在与web服务器相同的框中。因此,在3中简要提到了消息总线方法。但是,如果您决心这样做,并且确信这些任务不会占用所有的CPU,那么您应该确定此类任务的流行频率。如果每个web请求都有Node.js,那么就不应该使用Node.js;您正在放弃它最基本的优势,只留下一些次要的优势(比如围绕它成长的生态系统)。如果它们很少见,那么您应该通过2中提供的许多方法在单独的线程中剥离它们。

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

如果您是一个基于Python的商店,您可能还需要考虑Twisted这是一个用Python编写的事件驱动框架。Twisted还可以将长时间运行的阻塞工作推迟到线程。

最重要的是你首先要确定你需要什么,你的问题是什么。不要因为每个人都在谈论这件新奇的事就轻举妄动。看看你的需求,用一些能满足它们的东西。

我看到有一个node.js模块模式在WSGI之后:Strata

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

相关问题 更多 >