使用Node.js服务器,我想知道它是否可能并且建议从委派的工作进程而不是主进程发送HTTP响应 . 这些工作进程可以是Node.js服务器本身,也可以是通过IPC进行通信的Node.js子进程 .
我不认为集群核心模块https://nodejs.org/api/cluster.html可以做我想做的事情,因为在该模型中,所有工作人员都在监听同一个端口,并且他们代表主进程处理所有请求 . 我正在寻找的是一个响应所有HTTP请求的主要Node.js进程,可能是进行身份验证并处理某些请求,但也能够将数据密集型或CPU密集型请求委派给工作池 .
想象一下,我们有大量数据的GET请求,比如说2-3MB .
我们至少有三种可能的情况:
-
主进程接收请求,向数据库询问大量数据,然后将数据发送回请求者 .
-
主进程接收请求,使用IPC将一些数据发送到工作进程,工作者从数据库获取数据做一些繁重的操作,然后工作者使用IPC将所有3MB数据发送回主进程,然后发回响应 .
-
主进程接收请求,将关于请求流的尽可能少的信息发送给工作者,工作人员完成所有工作,工作人员发回HTTP响应 .
我对使#3成为可能感到特别好奇 .
方案3的简单描述如下:
(为了清楚起见,我不希望一个请求有3个响应,我只是想表明一个工作者可能代表主进程发送响应) .
任何人都知道这可能与Node.js一起使用吗?如何在其他语言中使用?通常我对Node.js并发模型没有任何问题,但是对于某些类型的数据,使用Cluster模块可能不是实现最高并发级别的最佳方法 .
我相信这个模型的一个术语是"direct response",这意味着工作者直接响应请求 . 也许可以简单地使用集群核心模块https://nodejs.org/api/cluster.html .
2 回答
是的,这是可能的,也可能是最简单的扩展应用服务器的最常用方法 . 与IPC不同,它可以通过网络跨主机工作 . (如果你想要它,它也将在本地工作......但确保你的应用程序实际上是CPU绑定的 . 尽管JavaScript本身是单线程的,但IO和一些NPM模块的大多数库都使用线程池 . )
没有理由使用Node.js作为后端服务器之间的服务器负载 balancer . Node.js更适合您的应用程序服务器 . 对于只是代理HTTP请求的东西,我会使用Nginx或类似的东西 . Nginx可以有效地处理与客户端的所有处理,并且可以轻松配置为负载 balancer .
如果您尝试在您的机器中使用多个处理器(执行Node本身只使用一个进程),只需使用PM2:
https://www.npmjs.com/package/pm2
PM2在您指定给PM2的处理器上启动应用程序的各种实例 . 如果您的应用程序是无状态的(因为它理想情况下使用Node),您的应用程序的实例将在每个处理器上运行,PM2将执行路由 .
如果我可以口头重新绘制您为方案3发布的图表,PM2将取代“MAIN”,“W”将替换为您的应用程序,无需担心 Worker 和分叉 .
我们在 生产环境 中使用PM2,它对我们来说效果很好 .