"与Node.js的直接响应" - 使用不同的Node.js进程发送HTTP响应(与主进程不同)

时间:2016-03-01 19:22:53

标签: javascript node.js http express multiprocessing

使用Node.js服务器,我想知道是否可能并且建议从委派的工作进程而不是主进程发送HTTP响应。这些工作进程可以是Node.js服务器本身,也可以是通过IPC进行通信的Node.js子进程。

我认为群集核心模块https://nodejs.org/api/cluster.html可以做我想做的事情,因为在该模型中,所有工作人员都在监听同一个端口,并且他们代表处理所有请求主过程。我正在寻找的是一个响应所有HTTP请求的主要Node.js进程,可能是进行身份验证并处理某些请求,但也能够将数据密集型或CPU密集型请求委派给工作池。

想象一下,我们有大量数据的GET请求,比如说2-3MB。

我们至少有三种可能的情况:

  1. 主进程收到请求,向数据库询问大量数据,然后将数据发送回请求者。
  2. 主进程接收请求,使用IPC向工作进程发送一些数据,工作者从数据库获取数据做一些繁重的操作,然后工作者使用IPC将所有3MB数据发送回主进程进程,然后发回响应。
  3. 主进程收到请求,尽可能向请求流发送有关请求流的信息,工作人员完成所有工作,工作人员发回HTTP响应。
  4. 我特别好奇让#3成为可能。

    方案3的简单描述如下:

    enter image description here

    (为了清楚起见,我不想要一个请求的3个响应,我只是想表明一个工作人员可能代表主要流程发送响应。)

    任何人都知道这对Node.js有用吗?如何在其他语言中使用?通常我对Node.js并发模型没有任何问题,但对于某些类型的数据,使用Cluster模块可能不是实现最高并发级别的最佳方法。

    我相信这个模型的一个术语是"直接响应",这意味着工作者直接响应请求。也许只需使用集群核心模块https://nodejs.org/api/cluster.html即可。

2 个答案:

答案 0 :(得分:0)

  

我想知道是否有可能并建议从委派的工作进程发送HTTP响应

是的,这是可能的,也可能是最简单的扩展应用服务器的最常用方法。与IPC不同,它可以通过网络跨主机工作。 (如果你想要它,它也将在本地工作......但确保你的应用程序实际上是CPU绑定的。尽管JavaScript本身是单线程的,但IO和一些NPM模块的大多数库都使用线程池。 )

没有理由使用Node.js作为后端服务器之间的服务器负载平衡。 Node.js更适合您的应用程序服务器。对于只是代理HTTP请求的东西,我会使用Nginx或类似的东西。 Nginx可以有效地处理客户端的所有处理,并且可以轻松配置为负载平衡。

答案 1 :(得分:0)

如果您尝试在您的计算机中使用多个处理器(执行Node本身只使用一个进程),只需使用PM2:

https://www.npmjs.com/package/pm2

PM2在您指定给PM2的处理器上启动应用程序的各种实例。如果您的应用程序是无状态的(理想情况下是使用Node),您的应用程序的实例将在每个处理器上运行,PM2将执行路由。

如果我可以口头重新绘制您为方案3发布的图表,PM2将代替" MAIN"和" W"将被您的应用程序取代,无需担心工人和分叉。

我们在生产中使用PM2,它对我们来说效果很好。