“使用Node.js进行直接响应” – 使用不同的Node.js进程发送HTTP响应(与主进程不同)

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

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

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

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

  1. 主进程接收到请求,向数据库请求大量的数据,然后将数据发送回请求者。
  2. 主进程接收到请求后,使用IPC将一些数据发送给工作进程,工作人员从数据库获取数据做了一些繁重的操作,然后工作人员使用IPC将所有3MB的数据全部发送回主进程,然后发送回应。
  3. 主进程接收请求,向工作人员发送尽可能less的关于请求stream的信息,工作人员完成所有工作,工作人员发回HTTP响应。

我特别好奇#3可能。

情景3的简单描述如下:

在这里输入图像描述

(要明确一点,我不想要一个请求的三个响应,我只是想表明一个工作人员可能代表主进程发送响应)。

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

我相信这个模型的一个术语是“直接回应”,意思是工作人员直接回应请求。 也许可以简单地使用集群核心模块https://nodejs.org/api/cluster.html 。

我想知道如果这是可能的,并build议发送来自委托工作进程的HTTP响应

是的,这是可能的,也许是最简单的扩展你的应用程序服务器的最常见的方式。 与IPC不同,它可以通过networking跨主机工作。 (如果你愿意的话,它也可以在本地工作,但是确保你的应用程序实际上是CPU绑定的。尽pipeJavaScript本身是单线程的,但是IO和一些NPM模块的大部分库都使用线程池。 )

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

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

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

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

如果我可以口头重新绘制您为scheme3发布的图表,那么PM2将代替“MAIN”,“W”将replace为您的应用程序,无需担心工作人员和分叉。

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