Lorsque l'on associe socket.io/node.js et redis pub/sub pour tenter de créer un système de diffusion web en temps réel piloté par les événements du serveur et capable de gérer plusieurs transports, il semble y avoir trois approches possibles :
-
Créez une connexion redis avec 'createClient' et abonnez-vous au(x) canal(aux). Sur la connexion client socket.io, joindre le client dans une chambre socket.io. Dans l'événement redis.on("message", ...), appelez io.sockets.in(room).emit("event", data) pour distribuer à tous les clients dans la salle concernée. Comme Comment réutiliser une connexion redis dans socket.io ?
-
createClient' une connexion redis. Sur la connexion client socket.io, joindre le client dans une chambre socket.io et s'abonner au(x) canal(aux) redis approprié(s). Incluez redis.on("message", ...) dans la fermeture de la connexion client et, à la réception du message, appelez client.emit("event", data) pour déclencher l'événement sur le client spécifique. Comme la réponse dans Exemples d'utilisation de RedisStore dans socket.io
-
Utilisez le RedisStore intégré dans socket.io et diffusez à partir du canal unique "dispatch" de Redis en suivant le protocole socketio-spec.
Le numéro 1 permet de traiter le sous Redis et l'événement associé une fois pour tous les clients. Le numéro 2 offre un accès plus direct à Redis pub/sub. Le numéro 3 est plus simple, mais offre peu de contrôle sur les événements de messagerie.
Cependant, lors de mes tests, tous présentent des performances étonnamment faibles avec plus d'un client connecté. Les événements serveur en question sont 1 000 messages publiés sur un canal Redis le plus rapidement possible, pour être distribués le plus rapidement possible. Les performances sont mesurées par les timings au niveau des clients connectés (basés sur socket.io-client qui enregistrent les timestamps dans une liste Redis pour analyse).
Ce que je suppose, c'est que dans l'option 1, le serveur reçoit le message, puis l'écrit séquentiellement à tous les clients connectés. Dans l'option 2, le serveur reçoit chaque message plusieurs fois (une fois par abonnement client) et l'écrit au client concerné. Dans les deux cas, le serveur n'arrive pas au deuxième événement de message avant qu'il ne soit communiqué à tous les clients connectés. Une situation clairement exacerbée avec l'augmentation de la concurrence.
Cela semble aller à l'encontre de la sagesse perçue des capacités des piles. Je veux y croire, mais j'ai du mal.
Ce scénario (distribution à faible latence d'un grand volume de messages) n'est-il pas (encore) possible avec ces outils, ou est-ce que je rate une astuce ?