Ho usato Redis , NGINX e PHP-FPM per il mio progetto di chat. Non super elegante, ma fa il trucco. Ci sono alcuni pezzi del puzzle.
-
C'è uno script PHP molto semplice che riceve i comandi del client e li inserisce in un enorme LIST. Controlla anche tutte le LISTE delle stanze e la LIST privata degli utenti per vedere se ci sono messaggi che deve consegnare. Questo viene sottoposto a polling da un client scritto in jQuery e viene eseguito ogni pochi secondi.
-
Esiste uno script PHP della riga di comando che opera lato server in un ciclo infinito, 20 volte al secondo, che controlla questo elenco e quindi elabora questi comandi. Lo script gestisce chi si trova in quale stanza e le autorizzazioni nella memoria degli script, queste informazioni non sono archiviate in Redis.
-
Redis ha una LISTA per ogni stanza e una LISTA per ogni utente che opera come coda privata. Ha anche più contatori per ogni stanza in cui si trova l'utente. Se il contatore degli utenti è inferiore al totale dei messaggi nella stanza, allora ottiene la differenza e la invia all'utente.
Non sono stato in grado di sottoporre a stress test questa soluzione, ma almeno dal mio benchmarking di base potrebbe probabilmente gestire molte migliaia di messaggi al secondo. C'è anche l'opportunità di trasferirlo su qualcosa come Node.js per aumentare le prestazioni. Anche Redis sta maturando e ha alcune caratteristiche interessanti come i comandi Pub/Subscribe, che potrebbero essere interessanti, che potrebbero rimuovere il polling sul lato server.
Ho esaminato le soluzioni basate su Comet, ma molte di esse erano complicate, scarsamente documentate o richiedevano l'apprendimento di una lingua completamente nuova (ad es. Jetty->Java, APE->C), ecc... Anche la consegna e l'esecuzione di proxy a volte possono essere un problema con Comet. Ecco perché mi sono limitato ai sondaggi.
Immagino che potresti fare qualcosa di simile con MongoDB. Una collezione per stanza, una collezione per utente e poi una collezione che mantiene i contatori. Avrai comunque bisogno di scrivere un demone o uno script di back-end per gestire la gestione di dove vanno questi messaggi. Potresti anche usare le "raccolte limitate" di MongoDB, che mantiene i documenti ordinati e cancella automaticamente anche i vecchi messaggi, ma ciò potrebbe essere complicato nel mantenere i contatori appropriati.