我不了解Node.js架构

时间:2012-05-26 19:31:44

标签: javascript python node.js

我们正在考虑node.js作为网络平台。但我有一个至关重要的问题,因为我认为我没有得到node.js的架构:

  1. 看起来默认情况下你被迫使用他们的自定义HTTP服务器,没有WSGI或任何东西?!

  2. 看起来当在响应中做一些“真实计算”(不仅仅是一些I / O)时,所有基础设施都搞砸了,ab -n ... -c ...每次请求都会返回很多次。 Python - Pyramid / Flask还是其他什么?!

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

3 个答案:

答案 0 :(得分:13)

  1. 你自相矛盾:“默认情况下”和“强制”不兼容。您可以使用任何您想要的HTTP库。核心http模块可能被视为“默认”,但没有什么能阻止您使用其他模块。

  2. JavaScript是一种单线程语言,Node.js是一个JavaScript运行时,而不是像许多其他人一样产生每个响应的线程的Web服务器。如果需要,您仍然可以为每个响应执行一个线程,并且有一些基于Node构建的项目可以执行此操作,但是您将失去Node的大部分好处。如果你正在做一些计算繁重的事情以响应web请求(并且你有客户愿意等你去做),你应该通过许多可用的解决方案(web worker,threads)分离一个单独的线程-a-go-go,child_process等。)

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

  4. 回顾一下你的问题,你似乎对Node.js的基本误解,如果你试图将它与Python和WSGI集成。 Node.js用于编写Web服务器,因此尝试使用它...以及Python?在Python里面? (我真的不确定你想要完成什么)没什么意义。

    如果您的任务不仅受限于I / O,您可能不应该将这些任务托管在与Web服务器相同的框中。因此,消息总线方法在3中简要提到。但是如果您决定这样做,并确保这些任务不会占用所有CPU,那么您应该确定此类任务的频繁发生频率。如果它们出现在每个Web请求中,则不应使用Node.js;你放弃了它最基本的优势,只留下较小的优势(就像在它周围长大的生态系统)。如果它们很少见,那么你应该通过2中的许多方法在不同的线程中将它们分开。

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

答案 1 :(得分:3)

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

最重要的是,您首先要定义您需要的内容以及您的问题所在。不要因为每个人都在谈论它而跳上新奇特的东西。看看你的需求并使用解决它们的东西。

答案 2 :(得分:0)

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

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