Sto sviluppando una chat web in tempo reale utilizzando il pattern pubub . Per essere concreto sto usando python e tornado-redis su back end e websockets (WS) (tornado) sul front-end. Ho una connessione WS aperta e chiusa eventi. Quindi ho bloccato il problema qual è la soluzione migliore per archiviare l'attuale elenco di utenti online.
Ecco alcune tesi :
- Vorrei eseguire più thread in modo che i dati sugli utenti online dovrebbero persiste in accessibile per tutto il posto. Il ridimensionamento orizzontale richiede lo stesso.
- Un utente può aprire più connessioni. Significato stesso nome utente può essere presente in più istanze di connessione.
Soluzioni :
- Store in nessun posto! Significa che quando ho bisogno di notizie online basta trasmettere un messaggio a tutti e determinare chi è online dalle risposte. (+) conosco reale elenco utenti ogni volta, (-) questo accresce i tempi di elaborazione e complica l'implementazione).
- Memorizza le informazioni online nel database in una tabella separata. Ogni riga della tabella corrisponde a una singola connessione. (Nella realizzazione corrente è redis hmap.
{"hash of current connection" : "username"}
. hset su WS apertura (un utente si connette) , hdel su WS che chiude (utente si disconnette) . (+) Veloce se ho solo bisogno di essere aggiornato online, (-) se un utente si disconnette e la connessione al database viene persa nello stesso momento in cui le informazioni sul DB sarebbero sbagliate. - Specifico per i redis e la mia attuale realizzazione. Poiché ho una singola connessione redis per connessione WS, posso memorizzare le informazioni utente in tornado clientname . Poiché redis ha già informazioni sugli utenti connessi. Posso ottenere elenco-clienti , filtrarlo secondo alcuni criteri (clientname) e andare online. (+) delegato online ai redis. (-) La memorizzazione di più elenchi online diventa complicata. Ad esempio se webchat ha più stanze (ne assumiamo 100) l'archiviazione online per ogni stanza in un singolo posto appare un po 'disordinata.
Quale soluzione soddisfa al meglio le mie esigenze o hai una soluzione migliore?