web-dev-qa-db-fra.com

Exemples d'utilisation de RedisStore dans socket.io

J'essaie de faire évoluer une simple application socket.io sur plusieurs processus et/ou serveurs.

Socket.io supporte RedisStore mais je ne sais pas comment l'utiliser.

Je regarde cet exemple, http://www.ranu.com.ar/post/50418940422/redisstore-and-rooms-with-socket-io

mais je ne comprends pas en quoi l'utilisation de RedisStore dans ce code serait différente de l'utilisation de MemoryStore. Est-ce que quelqu'un peut me l'expliquer?

De plus, quelle est la différence entre configurer socket.io pour utiliser redisstore et créer votre propre client Redis et définir/obtenir vos propres données?

Je suis nouveau dans les domaines node.js, socket.io et redis, alors veuillez indiquer si j'ai oublié quelque chose d'évident.

27
Rollin_s

mais je ne comprends pas en quoi l'utilisation de RedisStore dans ce code serait différente de l'utilisation de MemoryStore. Est-ce que quelqu'un peut me l'expliquer?

La différence est que, lorsque vous utilisez la variable MemoryStore par défaut, tout message que vous émettez dans un opérateur ne sera envoyé qu'aux clients connectés au même opérateur, car il n'y a pas IPC entre les employés. En utilisant RedisStore, votre message sera publié sur un serveur Redis, auquel tous vos employés s’abonnent. Ainsi, le message sera capté et diffusé par tous les travailleurs et tous les clients connectés.

De plus, quelle est la différence entre configurer socket.io pour utiliser redisstore et créer votre propre client Redis et définir/obtenir vos propres données?

Je ne connais pas très bien RedisStore et je ne suis donc pas sûr de toutes les différences. Mais le faire soi-même serait une pratique parfaitement valable. Dans ce cas, vous pouvez publier tous les messages sur un serveur Redis et écouter ceux de votre gestionnaire de socket. Ce serait probablement plus de travail pour vous, mais vous auriez également plus de contrôle sur la façon dont vous voulez le configurer. J'ai moi-même fait quelque chose de similaire:

// 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();
  });
});

Cela signifie également que vous devez vous charger vous-même d'un routage de messages plus avancé, par exemple en publiant/abonnant à différents canaux. Avec RedisStore, vous bénéficiez de cette fonctionnalité gratuitement en utilisant les canaux socket.io (io.sockets.of("channel").emit(...)).

Un inconvénient potentiellement important avec ceci est que les sessions socket.io ne sont pas partagées entre les travailleurs. Cela posera probablement des problèmes si vous utilisez l'un des transports à interrogation longue.

26

J'ai mis en place un petit projet github qui utilise redis comme magasin de données.

Vous pouvez maintenant exécuter plusieurs processus serveur socket.io.

https://github.com/markap/socket.io-scale

3
Martin Kapfhammer

De plus, quelle est la différence entre configurer socket.io pour utiliser redisstore et créer votre propre client Redis et définir/obtenir vos propres données?

La différence est que, lorsque vous utilisez «RedisStore», le fichier socket.io enregistre le battement de cœur du socket et les informations de session dans Redis. Si vous utilisez un cluster avec node.js, le client utilisateur peut fonctionner.

Sans redis, le client pourrait changer le processus node.js la prochaine fois, ainsi la session sera perdue.

2
Kaicui

La différence est que, si vous avez un cluster d'instances node.js en cours d'exécution, memStore ne fonctionnera pas car il ne sera visible que par un seul processus.

0
Tie Zhong