¿Pueden dos solicitudes http reunirse? Si puede, ¿cómo lo maneja el servidor nodeJS?

Ayer estuve dando una presentación sobre nodeJS. Alguien me hizo la siguiente pregunta:

Como sabemos, nodeJS es un servidor de un solo hilo, varias solicitudes llegan al servidor y envían todas las solicitudes al bucle de eventos. ¿Qué sucede si dos solicitudes llegan al servidor exactamente al mismo tiempo, cómo el servidor manejará esta situación?

Adiviné un pensamiento y respondí de nuevo a continuación:

Supongo que no hay dos solicitudes http que lleguen al servidor exactamente al mismo tiempo , todas las solicitudes llegan a través de un solo socket, por lo que estarán en cola. La solicitud HTTP tiene el siguiente formato:

httpPctFormt

la marca de tiempo de la solicitud está contenida en su encabezado y pueden enviarse al bucle de eventos dependiendo de su marca de tiempo en el encabezado.

pero no estoy seguro de si le di una respuesta correcta o incorrecta.

Supongo que no hay dos solicitudes http que lleguen al servidor exactamente al mismo tiempo, todas las solicitudes llegan a través de la tubería, por lo que estarán en cola.

Esta parte es básicamente correcta. Las conexiones entrantes entran en la cola de eventos y una de ellas debe colocarse primero en la cola.

¿Qué pasa si dos solicitudes llegan dos servidores al mismo tiempo, cómo el servidor manejará esta situación?

Dado que el servidor está escuchando las conexiones TCP entrantes en un solo socket en un solo proceso, no puede haber dos conexiones entrantes exactamente al mismo tiempo. Uno será procesado por el sistema operativo subyacente un poco antes que el otro. Piénsalo de esta manera. Una conexión entrante es un conjunto de paquetes a través de una conexión de red. Una de las conexiones entrantes tendrá sus paquetes antes que la otra.

Incluso si tenía varias tarjetas de red y múltiples enlaces de red, de modo que dos conexiones entrantes podrían llegar literalmente al servidor en el mismo momento, la cola de node.js estará protegida de la concurrencia por algo como una exclusión mutua y una de las conexiones entrantes se agarrará el mutex antes del otro y se coloca en la cola de eventos antes del otro.

El que primero procesa el sistema operativo se colocará en la cola de eventos node.js antes que el otro. Cuando node.js está disponible para procesar el siguiente elemento en la cola de eventos, entonces la solicitud entrante que haya sido la primera en la cola de eventos comenzará a procesarse primero.

Debido a que la ejecución de node.js JS es un solo hilo, el código que procesa esa solicitud ejecutará su código síncrono hasta su finalización. Si tiene una operación asíncrona, comenzará esa operación asíncrona y regresará. Eso permitirá que el siguiente elemento en la cola de eventos se procese y el código para la segunda solicitud comenzará a ejecutarse. Se ejecutará de forma síncrona hasta su finalización. Al igual que con la primera solicitud, si tiene una operación asíncrona, iniciará esa operación asíncrona y regresará.

En ese momento, después de que ambas solicitudes hayan iniciado sus operaciones asíncronas y luego hayan regresado, es justo lo que corresponde a la cola de eventos. Cuando una de esas operaciones asíncronas finalice, publicará otro evento en la cola de eventos y cuando el único hilo de node.js esté libre, volverá a procesar el siguiente elemento en la cola de eventos. Si ambas solicitudes tienen muchas operaciones asíncronas, su progreso podría intercalarse y ambas podrían estar “en vuelo” al mismo tiempo que disparan una operación asíncrona y luego retornan hasta que la operación asíncrona finaliza donde su procesamiento se recupera nuevamente cuando node.js es Libre para procesar ese próximo evento.

la marca de tiempo de la solicitud está contenida en su encabezado y pueden enviarse al bucle de eventos dependiendo de su marca de tiempo en el encabezado.

Esta parte no es realmente correcta. Los eventos entrantes del mismo tipo se agregan a la cola a medida que llegan. Los primeros en llegar entran primero en la cola: no hay ningún paso que examine alguna marca de tiempo.

Múltiples solicitudes HTTP concurrentes no son un problema. Node.js es asíncrono y manejará múltiples solicitudes en el ciclo de eventos sin tener que esperar a que finalice cada una.

Para referencia, ejemplo: https://stackoverflow.com/a/34857298/1157037