¿Cómo el servidor node.js atiende la siguiente solicitud, si la solicitud actual tiene un cálculo enorme?

Supongamos que estoy usando un servidor de nodos y hay una API que está generando una serie de 1 a 1 millón (es decir, una operación de CPU muy grande), por lo que en este caso, otra solicitud que llega al servidor está en cola (y hay que esperar mucho su turno). esto mata la experiencia del usuario) porque el nodo es un solo hilo.

¿Hay alguna otra solución que podamos hacer con node.js para no esperar las otras solicitudes de su turno tanto tiempo?

¿Cómo el servidor node.js atiende la siguiente solicitud, si la solicitud actual tiene un cálculo enorme?

No es así , si ese cálculo ocurre en el hilo principal y no se divide en partes más pequeñas.

Para tener la posibilidad de atender otras solicitudes durante una tarea que requiere un uso intensivo de la CPU, debe:

  1. divida su computación en partes y use setImmediate o process.nextTick para ejecutarlas
  2. use un proceso externo para esa tarea y llámelo como cualquier otro progtwig o servicio externo utilizando HTTP, TCP, IPC o el proceso de generación de procesos secundarios, o utilizando un sistema de colas, pub / sub, etc.
  3. escribe un complemento nativo en C ++ y usa hilos para eso

Lo importante es que necesita que la stack se desenrolle a menudo en su subproceso V8 para que el bucle de eventos tenga la posibilidad de manejar los eventos con la mayor frecuencia posible. Y tenga en cuenta que cuando tenga un cálculo prolongado que demore 10 segundos y lo divida en 1000 partes más pequeñas, su servidor seguirá sin poder atender nuevas solicitudes o cualquier otra E / S o evento 1000 veces durante 10ms cada vez. .

Si tiene una gran cantidad de operaciones con gran cantidad de CPU, le recomendaría encarecidamente que las elimine de su proceso para atender las solicitudes, no solo porque bloquea el bucle de eventos sino también porque, en tal caso, desea utilizar todos sus núcleos en al mismo tiempo, por lo que sería óptimo tener tantos procesos (o subprocesos) realizando el trabajo pesado de la CPU como los núcleos de la CPU (o posiblemente más con el subproceso) y tener todas las operaciones vinculadas a E / S en un proceso separado que no procesa las operaciones pesadas de la CPU por sí mismo.

Un solo hilo no significa que los procesos serán progtwigdos por First Come First Serve. En serio, no creo que las solicitudes múltiples se procesen al estilo First Come First Serve, por lo que esto no será un gran problema. Sin embargo, el sistema en general se ralentizará debido a las solicitudes que tardan demasiado en procesarse.

Y para eso, el nodo tiene una solución:

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

Lo que esto hace es que, básicamente, puede generar múltiples instancias de su aplicación, todas ejecutándose en el mismo puerto, por lo que si tiene varias solicitudes, una fracción muy pequeña de las cuales está tomando demasiado tiempo, entonces los otros procesos secundarios del clúster pueden responder. a las posteriores peticiones.