J'ai utilisé Redis , NGINX &PHP-FPM pour mon projet de chat. Pas super élégant, mais ça fait l'affaire. Il y a quelques pièces au puzzle.
-
Il existe un script PHP très simple qui reçoit les commandes du client et les place dans une énorme LISTE. Il vérifie également toutes les listes de salles et la liste privée des utilisateurs pour voir s'il y a des messages qu'il doit livrer. Ceci est interrogé par un client écrit en jQuery et c'est fait toutes les quelques secondes.
-
Il existe un script PHP en ligne de commande qui opère côté serveur dans une boucle infinie, 20 fois par seconde, qui vérifie cette liste puis traite ces commandes. Le script gère qui se trouve dans quelle pièce et les autorisations dans la mémoire des scripts, ces informations ne sont pas stockées dans Redis.
-
Redis a une LISTE pour chaque chambre et une LISTE pour chaque utilisateur qui fonctionne comme une file d'attente privée. Il dispose également de plusieurs compteurs pour chaque salle dans laquelle se trouve l'utilisateur. Si le compteur de l'utilisateur est inférieur au nombre total de messages dans la salle, il récupère la différence et l'envoie à l'utilisateur.
Je n'ai pas été en mesure de tester cette solution, mais au moins d'après mes analyses comparatives de base, elle pourrait probablement gérer plusieurs milliers de messages par seconde. Il est également possible de le porter sur quelque chose comme Node.js pour augmenter les performances. Redis est également en train de mûrir et propose des fonctionnalités intéressantes telles que les commandes Pub/Subscribe, qui pourraient être intéressantes, ce qui supprimerait éventuellement l'interrogation côté serveur.
J'ai examiné les solutions basées sur Comet, mais beaucoup d'entre elles étaient compliquées, mal documentées ou nécessitaient que j'apprenne un langage entièrement nouveau (par exemple, Jetty-> Java, APE-> C), etc. être un problème avec Comet. C'est pourquoi je suis resté fidèle aux sondages.
J'imagine que vous pourriez faire quelque chose de similaire avec MongoDB. Une collecte par pièce, une collecte par utilisateur &puis une collecte qui maintient des compteurs. Vous aurez toujours besoin d'écrire un démon ou un script back-end pour gérer la destination de ces messages. Vous pouvez également utiliser les "collections limitées" de MongoDB, qui conservent les documents triés et effacent également automatiquement les anciens messages, mais cela pourrait être compliqué pour maintenir des compteurs appropriés.