【问题标题】:"Direct Response with Node.js" - Sending HTTP response with different Node.js process (different than main process)“使用 Node.js 直接响应” - 使用不同的 Node.js 进程(不同于主进程)发送 HTTP 响应
【发布时间】: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 种可能的情况:

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

我对使#3 成为可能感到特别好奇。

场景 3 的简单描述如下:

(为了清楚起见,我不希望一个请求有 3 个响应,我只是想表明一个工作人员可以代表主进程发送响应)。

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

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

【问题讨论】:

  • 不久前我有一些类似的想法,但经过广泛搜索后,我最终使用 nginx 作为负载均衡器,这看起来就像您试图通过此实现的目标,但没有启动整个应用程序。如果有人有任何解决方案,我也很想知道。
  • 当然,谢谢,我认为 cluster.setupMaster 可能能够做我想做的事,但我还不确定,请参阅:nodejs.org/api/…
  • 例如,在此处查看接受的答案:stackoverflow.com/questions/23771516/…

标签: javascript node.js http express multiprocessing


【解决方案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 可以高效地处理与客户端的所有处理,并且可以轻松配置负载均衡。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2019-07-27
      • 1970-01-01
      • 2012-01-17
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2022-01-27
      • 2016-10-15
      相关资源
      最近更新 更多