我们正在考虑node.js
作为网络平台。但我有一个至关重要的问题,因为我认为我没有得到node.js
的架构:
看起来默认情况下你被迫使用他们的自定义HTTP服务器,没有WSGI或任何东西?!
看起来当在响应中做一些“真实计算”(不仅仅是一些I / O)时,所有基础设施都搞砸了,ab -n ... -c ...
每次请求都会返回很多次。 Python - Pyramid / Flask还是其他什么?!
那么,node.js
的作者认为我们只做了I / O,或者我错过了一些非常基本的东西?
答案 0 :(得分:13)
你自相矛盾:“默认情况下”和“强制”不兼容。您可以使用任何您想要的HTTP库。核心http
模块可能被视为“默认”,但没有什么能阻止您使用其他模块。
JavaScript是一种单线程语言,Node.js是一个JavaScript运行时,而不是像许多其他人一样产生每个响应的线程的Web服务器。如果需要,您仍然可以为每个响应执行一个线程,并且有一些基于Node构建的项目可以执行此操作,但是您将失去Node的大部分好处。如果你正在做一些计算繁重的事情以响应web请求(并且你有客户愿意等你去做),你应该通过许多可用的解决方案(web worker,threads)分离一个单独的线程-a-go-go,child_process等。)
Node.js的作者假设您正在编写Web服务器。您在Web服务器中执行的大多数操作本质上都是IO,无论IO是涉及文件系统,数据库,还是用于在其他工作流程上排队计算密集型任务的消息总线。
回顾一下你的问题,你似乎对Node.js的基本误解,如果你试图将它与Python和WSGI集成。 Node.js用于编写Web服务器,因此尝试使用它...以及Python?在Python里面? (我真的不确定你想要完成什么)没什么意义。
如果您的任务不仅受限于I / O,您可能不应该将这些任务托管在与Web服务器相同的框中。因此,消息总线方法在3中简要提到。但是如果您决定这样做,并确保这些任务不会占用所有CPU,那么您应该确定此类任务的频繁发生频率。如果它们出现在每个Web请求中,则不应使用Node.js;你放弃了它最基本的优势,只留下较小的优势(就像在它周围长大的生态系统)。如果它们很少见,那么你应该通过2中的许多方法在不同的线程中将它们分开。
答案 1 :(得分:3)
如果您是基于Python的商店,您可能还需要考虑使用Python编写的事件驱动框架Twisted。 Twisted还能够将长时间运行的阻塞工作推迟到线程。
最重要的是,您首先要定义您需要的内容以及您的问题所在。不要因为每个人都在谈论它而跳上新奇特的东西。看看你的需求并使用解决它们的东西。
答案 2 :(得分:0)
我看到在WSGI之后有一个node.js模块:Strata
此外,您可以将密集型计算卸载到子进程:Child Process