“使用 Node.js 直接响应” - 使用不同的 Node.js 进程(不同于主进程)发送 HTTP 响应
Posted
技术标签:
【中文标题】“使用 Node.js 直接响应” - 使用不同的 Node.js 进程(不同于主进程)发送 HTTP 响应【英文标题】:"Direct Response with Node.js" - Sending HTTP response with different Node.js process (different than main process) 【发布时间】:2016-06-14 09:15:21 【问题描述】:使用 Node.js 服务器,我想知道是否可以并建议从委派的工作进程而不是主进程发送 HTTP 响应。这些工作进程可能是 Node.js 服务器本身,或者只是通过 IPC 通信的 Node.js 子进程。
我不认为集群核心模块https://nodejs.org/api/cluster.html可以做我想做的事情,因为在那个模型中,所有的worker都在监听同一个端口,他们代表master进程处理所有的请求。我正在寻找的是一个响应所有 HTTP 请求的主要 Node.js 进程,可能进行身份验证并处理一些请求,但也能够将数据密集型或 CPU 密集型请求委托给工作池。
假设我们有一个对大量数据的 GET 请求,比如 2-3MB。
我们至少有 3 种可能的情况:
-
主进程接收请求,向数据库请求大量数据,然后将数据发送回请求者。
主进程收到请求,使用IPC向worker进程发送一些数据,worker从DB获取数据做一些繁重的操作,然后worker使用IPC将3MB的数据全部发送回主进程进程,然后发回响应。
主进程接收请求,向工作人员发送尽可能少的有关请求流的信息,工作人员完成所有工作,工作人员发回 HTTP 响应。
我对使#3 成为可能感到特别好奇。
场景 3 的简单描述如下:
(为了清楚起见,我不希望一个请求有 3 个响应,我只是想表明一个工作人员可以代表主进程发送响应)。
有人知道这如何与 Node.js 一起工作吗?它如何在其他语言中工作?通常我对 Node.js 并发模型没有任何问题,但是对于某些类型的数据,使用 Cluster 模块可能不是实现最高并发级别的最佳方式。
我相信这个模型的一个术语是“直接响应”,意思是工作人员直接响应请求。也许可以简单地使用集群核心模块https://nodejs.org/api/cluster.html。
【问题讨论】:
不久前我有一些类似的想法,但经过广泛搜索后,我最终使用 nginx 作为负载均衡器,这看起来就像您试图通过此实现的目标,但没有启动整个应用程序。如果有人有任何解决方案,我也很想知道。 当然,谢谢,我认为 cluster.setupMaster 可能能够做我想做的事,但我还不确定,请参阅:nodejs.org/api/… 例如,在此处查看接受的答案:***.com/questions/23771516/… 【参考方案1】:如果你试图利用机器中的多个处理器(单独执行 Node 只使用一个进程),只需使用 PM2:
https://www.npmjs.com/package/pm2
PM2 在您指定给 PM2 的处理器上启动应用程序的各种实例。如果您的应用程序是无状态的(理想情况下使用 Node),您的应用程序实例将在每个处理器上运行,并且 PM2 将执行路由。
如果我可以口头重绘您为场景 3 发布的图表,PM2 将取代“MAIN”,而“W”将被您的应用替换,无需担心工人和分叉。
我们在生产中使用 PM2,它对我们来说表现良好。
【讨论】:
【参考方案2】:我想知道是否可以并建议从委派的工作进程发送 HTTP 响应
是的,这是可能的,并且可能是扩展应用程序服务器最简单最常用的方法。与 IPC 不同,它可以通过网络跨主机工作。 (如果您愿意,它也可以在本地工作……但请确保您的应用程序实际上受 CPU 限制。尽管 javascript 本身是单线程的,但大多数 IO 库和一些 NPM 模块都使用线程池。 )
没有理由使用 Node.js 作为后端服务器之间的服务器负载平衡。 Node.js 更适合您的应用程序服务器。对于只是代理 HTTP 请求的东西,我会使用 Nginx 或类似的东西。 Nginx 可以高效地处理与客户端的所有处理,并且可以轻松配置负载均衡。
【讨论】:
以上是关于“使用 Node.js 直接响应” - 使用不同的 Node.js 进程(不同于主进程)发送 HTTP 响应的主要内容,如果未能解决你的问题,请参考以下文章
使用 Elasticsearch,我可以为不同的匹配标记使用不同的 HTML 标签突出显示吗?
为啥 CPU(使用 SKLearn)和 GPU(使用 RAPID)上的 RandomForestClassifier 获得不同的分数,非常不同?