sql >> Databasteknik >  >> NoSQL >> Redis

Hur skickar socket.io meddelanden över flera servrar?

Socket.io använder MemoryStore som standard, så alla anslutna klienter kommer att lagras i minnet vilket gör det omöjligt (nåja, inte tyst men mer om det senare) att skicka och ta emot händelser från klienter som är anslutna till en annan socket.io-server.

Ett sätt att få alla socket.io-servrar att ta emot alla händelser är att alla servrar använder redis pub-sub. Så istället för att använda socket.emit kan man publicera till redis.

redis_client = require('redis').createClient();
redis_client.publish('channelName', data);

Och alla socketservrar prenumererar på den kanalen genom redis och skickar det till klienter som är anslutna till dem när de får ett meddelande.

redis_sub = require('redis').createClient();
redis_sub.subscribe('channelName', 'moreChannels');

redis_sub.on("message", function (channel, message) {        
    socket.emit(channel, message);
});

komplicerade grejer!! Men vänta, det visar sig att du faktiskt inte behöver den här typen av kod för att uppnå målet. Socket.io har RedisStore som i huvudsak gör vad koden ovan ska göra på ett trevligare sätt så att du kan skriva Socket.io-kod som du skulle skriva för en enda server och fortfarande kommer att spridas till andra socket.io-servrar genom redis.

För att sammanfatta skickar socket.io meddelanden över flera servrar genom att använda redis som kanal istället för minne.



  1. Vilka är de underliggande skillnaderna mellan select, epoll, kqueue och evport?

  2. Lagra nycklar med prefix som upphör att gälla på redis

  3. Hur anropar man funktionen efter att ha slutfört asynkrona funktioner inuti loopen?

  4. Mongoimport av JSON-fil