Redis
 sql >> Base de données >  >> NoSQL >> Redis

Comment socket.io envoie-t-il des messages sur plusieurs serveurs ?

Socket.io utilise MemoryStore par défaut, donc tous les clients connectés seront stockés en mémoire, ce qui rendra impossible (enfin, pas tranquille mais plus à ce sujet plus tard) d'envoyer et de recevoir des événements de clients connectés à un autre serveur socket.io.

Une façon de faire en sorte que tous les serveurs socket.io reçoivent tous les événements est que tous les serveurs utilisent le pub-sub de redis. Ainsi, au lieu d'utiliser socket.emit, on peut publier sur redis.

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

Et tous les serveurs de socket s'abonnent à ce canal via redis et lorsqu'ils reçoivent un message, ils l'émettent aux clients qui leur sont connectés.

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

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

Des trucs compliqués !! Mais attendez, il s'avère que vous n'avez pas réellement besoin de ce type de code pour atteindre l'objectif. Socket.io a RedisStore qui fait essentiellement ce que le code ci-dessus est censé faire d'une manière plus agréable afin que vous puissiez écrire du code Socket.io comme vous le feriez pour un seul serveur et sera toujours propagé à un autre serveur socket.io via redis.

Pour résumer, socket.io envoie des messages sur plusieurs serveurs en utilisant redis comme canal au lieu de la mémoire.