2012-02-13 12 views
27

Estoy intentando escalar una aplicación socket.io simple en varios procesos y/o servidores.Ejemplos de uso de RedisStore en socket.io

Socket.io es compatible con RedisStore pero no estoy seguro de cómo usarlo.

estoy buscando en este ejemplo, http://www.ranu.com.ar/post/50418940422/redisstore-and-rooms-with-socket-io

pero no entiendo cómo el uso de RedisStore en ese código sería diferente el uso de MemoryStore. ¿Alguien puede explicar me lo?

¿Cuál es la diferencia entre configurar socket.io para usar redisstore vs. crear su propio cliente redis y establecer/obtener sus propios datos?

Soy nuevo en node.js, socket.io y redis así que por favor señale si me perdí algo obvio.

+0

Aquí es [una sección de código usando RedisStore con el nodo] (http://www.ranu.com.ar/2011/11/redisstore-and-rooms-with-socketio.html) que puede resultar interesante; sin embargo, no habla de diferencias; Estaba, irónicamente, simplemente leyendo sobre este tema :) – Kato

+0

Los enlaces para estos ya no funcionan =/ – qodeninja

Respuesta

26

pero no entiendo cómo usar RedisStore en ese código sería diferente de usar MemoryStore. ¿Alguien puede explicar me lo?

La diferencia es que cuando se utiliza el valor predeterminado MemoryStore, cualquier mensaje que emites en un trabajador sólo será enviado a los clientes conectados al mismo trabajador, ya que no hay IPC entre los trabajadores. Con el RedisStore, su mensaje se publicará en un servidor redis al que se suscriben todos sus trabajadores. Por lo tanto, el mensaje será recogido y transmitido por todos los trabajadores y todos los clientes conectados.

¿Cuál es la diferencia entre configurar socket.io para usar redisstore vs. crear su propio cliente redis y establecer/obtener sus propios datos?

No estoy íntimamente familiarizado con RedisStore, por lo que no estoy seguro de todas las diferencias. Pero hacerlo tú mismo sería una práctica perfectamente válida. En ese caso, podría publicar todos los mensajes en un servidor redis y escucharlos en su manejador de socket. Probablemente sea más trabajo para usted, pero también tendrá más control sobre cómo desea configurarlo. He hecho algo similar a mí mismo:

// Publishing a message somewhere 
var pub = redis.createClient(); 
pub.publish("messages", JSON.stringify({type: "foo", content: "bar"})); 

// Socket handler 
io.sockets.on("connection", function(socket) { 
    var sub = redis.createClient(); 
    sub.subscribe("messages"); 
    sub.on("message", function(channel, message) { 
    socket.send(message); 
    }); 

    socket.on("disconnect", function() { 
    sub.unsubscribe("messages"); 
    sub.quit(); 
    }); 
}); 

Esto también significa que tiene que cuidar de mensaje más avanzada de enrutamiento a sí mismo, por ejemplo, por la publicación/suscripción de diferentes canales. Con RedisStore, obtienes esa funcionalidad gratis usando los canales socket.io (io.sockets.of("channel").emit(...)).

Un inconveniente potencialmente grande con esto es que las sesiones de socket.io no se comparten entre los trabajadores. Esto probablemente significará problemas si usa cualquiera de los transportes de larga duración.

0

La diferencia es que si tiene un clúster de instancias node.js ejecutándose, MemStore no funcionará, ya que solo es visible para un solo proceso.

+1

¿Y cuál sería la solución? – nalply

+0

Trabajando en esto ahora mismo, esto es lo que hice para una tienda de conexión (IPC) y una tienda de sesión (que puede compartir con otro servidor ... ¡como Express!) Estamos probando esto en una configuración agrupada ahora-- Volveré a publicar aquí si veo algún problema. https://github.com/balderdashy/sails/tree/master/session_experiment – mikermcneil

3

Configuré un pequeño proyecto github para usar redis como almacén de datos.

Ahora puede ejecutar múltiples procesos del servidor socket.io.

https://github.com/markap/socket.io-scale

+0

parece obsoleto, RedisStore ya no está disponible en socket.io – Flion

2

también lo que se diferencia entre la configuración de socket.io utilizar redisstore vs.¿Crea su propio cliente redis y establece/obtiene sus propios datos?

La diferencia es que, cuando se utiliza 'RedisStore', el socket.io sí salvará el latido del corazón y la toma de información de la sesión en el Redis, y si se utiliza cluster con Node.js, el cliente usuario puede trabajar .

Sin redis, el cliente puede cambiar el proceso node.js la próxima vez, por lo que la sesión se perderá.

Cuestiones relacionadas