mas não entendo como usar RedisStore nesse código seria diferente de usar MemoryStore. Alguém pode explicar isso para mim?
A diferença é que ao usar o padrão
MemoryStore
, qualquer mensagem que você emitir em um trabalhador só será enviada para clientes conectados ao mesmo trabalhador, pois não há IPC entre os trabalhadores. Usando o RedisStore
, sua mensagem será publicada em um servidor redis, no qual todos os seus funcionários estão assinando. Assim, a mensagem será captada e difundida por todos os trabalhadores e todos os clientes conectados.
Além disso, qual é a diferença entre configurar o socket.io para usar redisstore vs. criar seu próprio cliente redis e definir/obter seus próprios dados?
Não estou familiarizado com o
RedisStore
, e por isso não tenho certeza sobre todas as diferenças. Mas fazer você mesmo seria uma prática perfeitamente válida. Nesse caso, você pode publicar todas as mensagens em um servidor redis e ouvi-las em seu manipulador de soquete. Provavelmente seria mais trabalhoso para você, mas você também teria mais controle sobre como deseja configurá-lo. Eu mesmo fiz algo parecido:// 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();
});
});
Isso também significa que você precisa cuidar do roteamento de mensagens mais avançado, por exemplo, publicando/assinando em diferentes canais. Com
RedisStore
, você obtém essa funcionalidade gratuitamente usando os canais socket.io (io.sockets.of("channel").emit(...)
). Uma desvantagem potencialmente grande com isso é que as sessões do socket.io não são compartilhadas entre os trabalhadores. Isso provavelmente significará problemas se você usar qualquer um dos transportes de sondagem longa.