2012-03-22 15 views
5

Así que estoy empezando a sumergirse en el Nodo y entiendo que la E/S es no bloqueante y que el bucle de eventos está bloqueando pero lo que me pregunto es:¿Puede un servidor Node.js aceptar solicitudes entrantes mientras la cola de eventos está bloqueada?

Si tiene código que está bloqueando la cola de eventos, ¿el servidor aún podrá colocar las solicitudes entrantes al final de la cola o todas terminarán el tiempo de espera/rebote?

+0

Esa es una buena pregunta que alguien familiarizado con las partes internas de Node.js puede responder. I * sospecho * que la biblioteca C++ del objeto '' http'' maneja la E/S real en un hilo separado, por lo que * debería * estar haciendo cola peticiones (quizás no añadiendo eventos en la cola hasta que se da el ciclo de evento) control de nuevo y se interpretan y agregan los eventos pendientes?) –

+0

Por lo que he leído, sé que la E/S es asíncrona, pero después de hacer una breve búsqueda en google de cómo funciona la programación asíncrona, leí que la sincronización no genera nuevos hilos. ¿Es eso cierto? –

+0

"la programación asincrónica promueve el uso del mismo hilo para procesar solicitudes múltiples, secuencialmente, pero sin solicitud de bloqueo del hilo, como veremos más adelante las operaciones realizadas por las solicitudes se ejecutarán" en pedazos "." http: // www. theserverside.com/discussions/thread.tss?thread_id=61693 –

Respuesta

2

Esto no tiene nada que ver con el nodo, o al menos esta discusión hasta ahora presenta ninguna evidencia de comportamiento del nodo.

La pila TCP en sí acepta la conexión en una cola propia sin la ayuda del programa que está utilizando el socket aceptante. Si esa cola se llena, se realizan más solicitudes para esperar hasta que la cola de conexión TCP tenga espacio. Tales conexiones "inaceptables" no se rebotan, aunque podrían expirar si las cosas realmente se retrasan.

En pocas palabras, la respuesta de muestra, utilizando curl, no prueba nada más allá del comportamiento básico de la pila TCP, pero eso probablemente no importe, porque la preocupación original del póster era que las conexiones rebotaran. Eso solo ocurrirá si su servidor está tan sobrecargado (o mal escrito, tal vez) que está sobrecargado de manera efectiva, y el dumping de algunas solicitudes es la mejor oportunidad que tiene de al menos proporcionar algún servicio a algunos usuarios.

+0

Gracias, realmente me gusta esta respuesta. No estaba al tanto de la pila de TCP –

9

Sí. El servidor aún puede poner en cola solicitudes. Para demostrar, hice el siguiente archivo que bloquea durante 10 segundos, lo ejecutó y curvó el servidor en otra terminal.

require('http').createServer(function(req, res) { 
    console.log('got a request!'); 
    res.end('hello world!\n'); 
}).listen(3000); 

var t = Date.now(); 
console.log('blocking..'); 
while(t + 10000 > Date.now()); 
console.log('not blocking anymore'); 

El resultado de ejecutarlo

blocking.. 
not blocking anymore 
got a request! 
+0

Bien, creo que eso lo responde bien. Me pregunto si las solicitudes entrantes se colocaron en la cola después de que ocurriera el bloqueo y luego se registró 'recibí una solicitud' o si la solicitud entrante se colocó en la cola DURANTE el bloqueo y luego 'recibió una solicitud' se activó después el ciclo de eventos fue liberado. –

+0

Esto responde el aspecto más importante de la pregunta, sin embargo, las solicitudes entrantes no rebotaron ... que era mi principal preocupación. Gracias señor –

+0

Si la E/S es realmente asíncrona, debería haberse colocado durante el bloqueo, pero si la cola de eventos está bloqueada, no veo cómo podría aceptar más eventos ...a menos que la cola misma se encuentre en el entorno asíncrono y cada evento se maneje en el entorno de bloqueo ... supongo que la pregunta es si la cola del evento está en el entorno asincrónico o de bloqueo ... pero para todos los propósitos intensivos, la pregunta es contestada. Puedo dormir por la noche –

Cuestiones relacionadas