2011-03-24 26 views
7

Estoy tratando de crear una aplicación web que utilizará el Server-Sent Events draft. Por lo que sé, las SSE utilizan un hilo por conexión, y como el servidor va a bombear continuamente datos al cliente, sin estar inactivo ni por un segundo, no hay forma de que pueda volver a poner el hilo en el grupo.Eventos enviados por el servidor en Node.JS

Por lo tanto, estoy tratando de usar Node.JS (que no he usado hasta la fecha) para manejar las conexiones al servidor. He pasado por el HTML5 Rocks introduction to SSE y hay un ejemplo de código que integra SSEs con Node.JS.

Sin embargo, no estoy seguro de si Node.JS manejará las miles de conexiones de clientes al mismo tiempo y utilizará el servidor de manera más eficiente que un servidor Apache? ¿Alguien puede ayudarme a entender cómo actuará exactamente Node aquí?

Disculpe si me parece un poco demasiado vago. ¡Estoy listo para hacer tantas aclaraciones como sea posible! ¡Gracias!

+0

si usted no tiene, ver este vídeo de introducción (sí, es larga, pero es bueno) http://www.yuiblog.com/blog/2010/05/20/video-dahl/ – generalhenry

+0

sabes que IE y FF son un no-go para este método ¿verdad? –

+0

@generalhenry - Gracias por el enlace. Lo verificará. – 0xff0000

Respuesta

4

php:

do { 
    sendMsg($startedAt , time()); 
    sleep(5); 
} while(true); 

vs

Node.JS

setInterval(function() { 
    constructSSE(res, id, (new Date()).toLocaleTimeString()); 
}, 5000); 

la diferencia que los bloques de sueño el php hilo 5 segundos. Durante esos 5 segundos, el servidor necesita tener un hilo dedicado que no haga absolutamente nada. Un hilo por usuario

Con la versión node.js, setInterval no bloquea el hilo. El subproceso one node.js puede manejar todos los usuarios.

+0

Gracias por aclararlo con su última oración. Eso es lo que estaba buscando. Entonces, si tuviera que optimizar este manejo y decir que Node.JS manejara más de 20k conexiones simultáneas, ¿qué tendría que hacer? Tal vez debería preguntar que como una sección separada – 0xff0000

+0

la clave es asegurarse de que el nodo no se engombe con los cálculos, un ciclo malo engomará las obras. – generalhenry

2

Sin embargo, estoy confundido en cuanto a si Node.JS manejarán los miles de conexiones de clientes al mismo tiempo y utilizar el servidor de manera más eficiente de un servidor Apache? ¿Alguien puede ayudar a entender cómo exactamente Nodo va a actuar aquí?

Creo que deberías leer Understanding event loops and writing great code for Node.js para obtener una mejor comprensión del evento-loop. En node.js, nada bloquea, lo que le ahorrará toneladas de ciclos de CPU.

También TJ's ebook puede ayudarlo a comprender los eventos. Cuando sucede algo, se llamará a su devolución de llamada asociada con ese evento.

+0

Muchas gracias por el enlace. Sin embargo, cuando estoy usando Node.JS para entregar eventos enviados por el servidor, ¿necesito escribir algún código de tubería explícito en Node.JS o lo haré automáticamente hasta cierto punto? – 0xff0000

+0

Probablemente deberías usar el almacén de datos (redis) para almacenar tus mensajes. Los semánticos pubsub de redis también son muy poderosos. También te aconsejo que eches un vistazo a socket.io, que también es muy poderoso. – Alfred

3

Intente mirar el artículo Understanding the node.js event loop con respecto a las conexiones concurrentes. Recomendaría crear una aplicación web que utilice WebSockets en lugar de eventos enviados por el servidor porque las SSE son menos compatibles con los navegadores que WebSockets. También hay muchos módulos basados ​​en WebSockets node.js con códigos fuente en GitHub que pueden "inspirarte".

+0

Eso y socket.io facilitan que no importe el transporte que admite el navegador, ya que puede emular los zócalos incluso en ie6 – generalhenry

+0

Gracias por el puntero. Estaba pensando más en las líneas de eventos enviados por el servidor, lo que permite ahorrar un ancho de banda valioso, ya que solo acepta una solicitud y luego envía continuamente datos. – 0xff0000

1

Intente utilizar express + connect-sse:

var sse, express, app; 

sse = require('connect-sse')(); 
express = require('express') 

app = express() 
app.get('/events', sse, function (req, res) { 
    res.json("this is an event"); 
    res.json({here: "is", another: "event"}); 
}); 
Cuestiones relacionadas