【问题标题】:Nodejs eventloop request response architecture for sending multiple responses to multiple client`s requestsNodejs 事件循环请求响应架构,用于向多个客户端的请求发送多个响应
【发布时间】:2020-11-22 06:48:17
【问题描述】:

我正在学习一个nodejs结构,并来到了事件循环和请求-响应架构模型。根据文档和多篇文章.as事件循环处理非阻塞操作并将阻塞操作委托给内部线程池,当线程完成操作时,它们在回调中准备响应并来到事件循环处理响应的主堆栈并发送回客户端。它表明我们是否有需要 CPU 而不是 db 或文件 (I/O) 操作的任务,我们的代码将处于阻塞状态(因为它需要时间来解决)。 如果我们像在前端 javascript 中那样将这项繁重的任务包装在 Promise 中(浏览器将处理 executor 函数)。 这是一个好习惯还是我在寻找错误的解决方案?我知道这不是 I/O 操作。 还有一个疑问,主线程完成I/O操作的回调执行,并向客户端发送响应,如果有多个响应准备发送回客户端,会阻塞主线程,是否会导致进程变慢?

【问题讨论】:

  • 能否请您就我的回答给我一些反馈?

标签: javascript node.js server io event-handling


【解决方案1】:

异步运行代码(没有工作线程)将无助于提高性能,因为它将在回调队列中排队。回调队列包含所有等待运行的回调,它们都在一个线程中运行。对于大多数 Web 应用程序,瓶颈不在事件循环上,但如果您有繁重的 CPU 消耗任务并希望利用所有 CPU 内核,您应该考虑以下之一:

  • 每个内核运行一个 Node.js 实例,并在其中设置一个负载均衡器(请记住,该机器仍然需要一些 CPU 用于 Node.js 内部异步功能、在同一台机器上运行的其他软件,以及上下文切换会产生适得其反的开销)
  • 使用worker threads(可从v10.5.0 获得)并使用它们的消息传递功能来同步它们

【讨论】:

    【解决方案2】:

    不,在 Promises 中处理繁重的 CPU 任务无助于处理主线程块,无论是在 Node.js 中还是在浏览器中。

    如果我们像在前端 javascript 中那样将这项繁重的任务包装在 promise 中(浏览器将处理执行器功能)

    抱歉,但 我们 不会在浏览器中“将繁重的任务包装在 Promise 中”,如果 这样做了并且您发现浏览器 HUD 没有被阻止,可能是您不是那么繁重的任务。

    处理繁重的 CPU 任务的正确工具是:

    主线程完成I/O操作的回调执行,并向客户端发送响应,如果有多个响应准备发送回客户端,会阻塞主线程,不会导致进程变慢吗?

    有大量并发请求/响应,是的,但我们谈论的是非常大量的并发请求/响应。

    【讨论】:

      【解决方案3】:

      如果您的应用程序是单用户的,即没有多个请求出现,那么最好使用 promise/callback/async-await。这是因为 NodeJs 将在后台执行异步操作,您无需担心并发,因为应用程序是基于单用户的。

      如果您的应用程序像 Web 应用程序一样是多用户的,那么最好在主运行程序(您的应用程序)之外运行单独的进程,以创建工作线程。这是因为,如果两个不同的客户端请求 CPU 密集型操作,您的主程序将不会挂起,两个请求将同时处理。然而,它有点难以管理,并且会花费高 CPU。有趣的是,在我研究的一本书中,Web 服务器进程为每个新传入请求创建一个新线程,以创建一个新的 TCP 套接字。此套接字用于唯一标识该请求。

      【讨论】:

        猜你喜欢
        • 2014-02-07
        • 1970-01-01
        • 2018-10-12
        • 2019-05-31
        • 2017-06-28
        • 2017-10-12
        • 1970-01-01
        • 2022-06-16
        • 1970-01-01
        相关资源
        最近更新 更多