Socket.io utilizza MemoryStore per impostazione predefinita, quindi tutti i client collegati verranno archiviati in memoria rendendo impossibile (beh, non silenzioso ma ne parleremo più avanti) inviare e ricevere eventi da client collegati a un server socket.io diverso.
Un modo per fare in modo che tutti i server socket.io ricevano tutti gli eventi è che tutti i server utilizzino pub-sub di redis. Quindi, invece di usare socket.emit si può pubblicare su redis.
redis_client = require('redis').createClient();
redis_client.publish('channelName', data);
E tutti i server socket si iscrivono a quel canale tramite redis e alla ricezione di un messaggio lo emettono ai client ad essi collegati.
redis_sub = require('redis').createClient();
redis_sub.subscribe('channelName', 'moreChannels');
redis_sub.on("message", function (channel, message) {
socket.emit(channel, message);
});
Roba complicata!! Ma aspetta, risulta che in realtà non hai bisogno di questo tipo di codice per raggiungere l'obiettivo. Socket.io ha RedisStore che essenzialmente fa ciò che il codice sopra dovrebbe fare in un modo migliore in modo da poter scrivere il codice Socket.io come si scriverebbe per un singolo server e verrà comunque propagato su un altro server socket.io tramite redis.
Per riassumere, socket.io invia messaggi su più server utilizzando redis come canale anziché memoria.