【问题标题】:How node.js server serve next request, if current request have huge computation?如果当前请求的计算量很大,node.js 服务器如何处理下一个请求?
【发布时间】:2017-08-17 04:46:31
【问题描述】:

假设我正在使用节点服务器,并且有一个 api 正在生成从 1 到 1 百万的系列(即非常巨大的 cpu 操作),所以在这种情况下,其他到达服务器的请求排队(并且等待很长时间轮到他们这会扼杀用户体验),因为节点是单线程的。

我们可以用 node.js 做任何其他解决方案吗?不用等待轮到他们的其他请求这么久?

【问题讨论】:

    标签: javascript node.js


    【解决方案1】:

    如果当前请求的计算量很大,node.js 服务器如何处理下一个请求?

    不会 - 如果该计算发生在主线程上并且没有分成更小的部分。

    要在 CPU 密集型任务期间有机会处理其他请求,您需要:

    1. 将您的计算分解为多个部分并使用 setImmediate 或 process.nextTick 运行它们
    2. 为该任务使用外部进程,并像使用 HTTP、TCP、IPC 或子进程生成的任何其他外部程序或服务一样调用它,或者使用队列系统、发布/订阅等。
    3. 用 C++ 编写本机插件并为此使用线程

    重要的是您需要在 V8 线程中经常展开堆栈,以便事件循环有机会尽可能频繁地处理事件。请记住,当您进行需要 10 秒的长时间计算并将其分成 1000 个较小的部分时,您的服务器仍将被阻止服务新请求或任何其他 I/O 或事件 1000 次,每次持续 10 毫秒.

    如果您有大量 CPU 密集型操作,那么我强烈建议您将它们移出处理请求的进程,这不仅是因为阻塞了事件循环,还因为在这种情况下您希望利用所有您的内核同时进行,因此最好让与 CPU 中的内核一样多的进程(或线程)执行 CPU 繁重的工作(或者使用超线程可能更多)并拥有所有的 I/O-将操作绑定在一个单独的进程中,该进程本身不会处理 CPU 繁重的操作。

    【讨论】:

      【解决方案2】:

      单线程并不意味着进程将由先到先服务安排。我真的不认为以先到先服务的方式处理多个请求,所以这不是什么大问题。但是,由于请求处理时间过长,整个系统会变慢。

      为此,节点有一个解决方案:

      https://nodejs.org/api/cluster.html

      这样做是,您基本上可以生成应用程序的多个实例,所有实例都在同一个端口上运行,因此如果您有多个请求,其中一小部分花费的时间太长,那么其他子进程在集群可以响应后续请求。

      【讨论】:

      • 什么是 FCFS?问题中未使用该术语,并且从您的回答中不清楚其含义。原谅我的无知。
      • fcfs = 先到先得。不知道这并不意味着无知或任何不好的事情,我什至不认为“先到先得”被缩写为 fcfs 太普遍了。我大学的教授就是这样做的,这就是我这样做的原因。很抱歉造成混乱。
      猜你喜欢
      • 2017-05-03
      • 1970-01-01
      • 1970-01-01
      • 2022-07-05
      • 1970-01-01
      • 1970-01-01
      • 2015-04-29
      • 2018-06-23
      • 1970-01-01
      相关资源
      最近更新 更多