ma non capisco come l'utilizzo di RedisStore in quel codice sarebbe diverso dall'utilizzo di MemoryStore. Qualcuno può spiegarmelo?
La differenza è che quando si utilizza il MemoryStore
predefinito , qualsiasi messaggio che emetti in un lavoratore verrà inviato solo ai client collegati allo stesso lavoratore, poiché non c'è IPC tra i lavoratori. Utilizzando il RedisStore
, il tuo messaggio verrà pubblicato su un server redis, a cui tutti i tuoi dipendenti sono iscritti. Pertanto, il messaggio verrà raccolto e trasmesso da tutti i lavoratori e tutti i client collegati.
Inoltre, qual è la differenza tra la configurazione di socket.io per l'utilizzo di redisstore e la creazione del proprio client redis e l'impostazione/ottenimento dei propri dati?
Non conosco molto bene RedisStore
, e quindi non sono sicuro di tutte le differenze. Ma farlo da soli sarebbe una pratica perfettamente valida. In tal caso, puoi pubblicare tutti i messaggi su un server redis e ascoltare quelli nel tuo gestore socket. Probabilmente sarebbe più lavoro per te, ma avresti anche più controllo su come vuoi configurarlo. Io stesso ho fatto qualcosa di simile:
// 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();
});
});
Ciò significa anche che devi occuparti di un instradamento dei messaggi più avanzato, ad esempio pubblicando/abbonandoti a canali diversi. Con RedisStore
, ottieni quella funzionalità gratuitamente usando i canali socket.io (io.sockets.of("channel").emit(...)
).
Un potenziale grosso svantaggio è che le sessioni di socket.io non sono condivise tra i lavoratori. Questo probabilmente significherà problemi se utilizzi uno dei trasporti con polling lungo.