javascript - "Direct Response with Node.js"- 使用不同的 Node.js 进程发送 HTTP 响应(不同于主进程)

标签 javascript node.js http express multiprocessing

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

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

假设我们有一个获取大量数据的 GET 请求,比如 2-3MB。

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

  1. 主进程接收请求,向数据库查询大量数据,然后将数据返回给请求者。
  2. 主进程收到请求,使用 IPC 将一些数据发送到工作进程,工作进程从数据库中获取数据并执行一些繁重的操作,然后工作进程使用 IPC 将所有 3MB 数据发送回主进程处理,然后发回响应。
  3. 主进程接收请求,向 worker 发送尽可能少的关于请求流的信息,worker 完成所有工作,worker 发回 HTTP 响应。

我特别好奇如何让#3 成为可能。

场景 3 的简单描述如下:

enter image description here

(明确一点,我不希望对一个请求有 3 个响应,我只是想表明一个工作人员可能代表主进程发送响应)。

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

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

最佳答案

I am wondering if it is both possible and recommended to send an HTTP response from a delegated worker process

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

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

关于javascript - "Direct Response with Node.js"- 使用不同的 Node.js 进程发送 HTTP 响应(不同于主进程),我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/35731630/

相关文章:

javascript - 是否可以从 MongoDB Map/Reduce 函数进行 REST 调用并处理结果?

javascript - 为这些 WHILE 编写更好、更紧凑的代码? :) (vanilla JavaScript)

javascript - 切换按钮以隐藏或取消隐藏 Facebook 评论框

node.js - 无法通过 Node 应用程序代理 AWS EMR Jupyter-Notebook 的套接字。加载内核失败

javascript - async/await 和 ES6 生成器之间的区别

javascript - 如何将对象文字作为 polymer 属性传递

javascript - Node js应用程序加载资源失败

python - 使用 Mechanize 处理非标准 401 header

Android 模拟器不处理 http get 请求,但 iOS 模拟器工作正常

html - 正确使用gumbo-parser来迭代并找到我需要的东西?