come memorizzare lo stato online

2

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?

    
posta deathangel908 26.08.2015 - 21:13
fonte

1 risposta

1

Ho trovato questa domanda a caso, ma ecco come lo farei io:

Sulla tua tabella users , crea una colonna chiamata lastActivity e rendila un tipo DateTime .

Quando ti connetti tramite websocket, chiedi al client di autenticare la connessione socket, (ad esempio inviando authToken o come preferisci). Durante l'autenticazione, si imposta l'id di user come proprietà sulla connessione.

Dopo l'autenticazione, chiedi al client di inviare messaggi periodici al server.

Quando il server riceve il messaggio, aggiorna lastActivity sull'utente, usa l'id che hai impostato sulla connessione per trovare l'utente che sta inviando il messaggio.

Ora nella tua applicazione puoi semplicemente confrontare il campo lastActivity , ad esempio se è più vecchio di 10 secondi e hai impostato per inviare un messaggio ogni 10 secondi, l'utente potrebbe essere considerato offline.

    
risposta data 02.09.2017 - 17:02
fonte

Leggi altre domande sui tag