Stato di trasmissione efficiente degli utenti

1

Questo si è rivelato un problema piuttosto interessante in contrasto con le mie aspettative.

Immagina una semplice app di chat, un utente si registra quindi può aggiungere altri utenti al proprio elenco di contatti e avviare conversazioni.

Voglio essere in grado di mostrare in tempo reale lo stato online di ciascun utente (per semplicità solo online / offline). Il problema è come farlo in modo efficiente.

L'app utilizza WebSockets per cui esiste un elenco di connessioni sul server che facilita l'attività e la soluzione più ovvia è quando un utente si connette o disconnette semplicemente trasmesso a tutti gli altri utenti. Questo ovviamente non sarà molto efficiente perché ogni utente che non ha il trigger nella propria lista di contatti semplicemente non si preoccuperà e se il numero di utenti è grande, così sarà sprecata la larghezza di banda.

Una soluzione più ottimizzata sarebbe quella di chiedere a un utente che effettua la connessione di chiedere lo stato di tutti nella propria lista di contatti. Quindi creare un elenco per ciascun utente sul server e memorizzare gli ID di tutti coloro che hanno chiesto il loro stato. In questo modo ogni volta che un utente si connette / disconnette avrò un elenco di utenti che si preoccupano di questo e posso trasmettere l'evento sapendo che nulla va sprecato. Tuttavia ciò che non mi piace di questo è che, come potete vedere, vi è una certa complessità aggiunta allo schema e mantenere tali liste sul server aumenterà la quantità di memoria utilizzata proporzionalmente alla quantità di utenti (che è sempre il caso, ma sembra troppo per un tale compito).

Dato che le app di chat non sono una novità, vorrei chiedere quali sono i metodi utilizzati per tale funzionalità nelle app esistenti o se esiste una soluzione di bullet bullet ben nota.

    
posta php_nub_qq 04.02.2018 - 16:41
fonte

1 risposta

1

Gli eventi di connessione / disconnessione sono probabilmente molto rari, quindi non ha molto senso ottimizzarlo eccessivamente. In particolare, le disconnessioni spesso si verificano durante un timeout. Se quel cambiamento di stato viene trasmesso pochi secondi dopo, non importa.

Ciò che conta sono le implicazioni sulla privacy. Non trasmettere lo stato a tutti gli utenti, ma pensa

  • a chi dovrebbe essere permesso di vedere lo stato e
  • chi è interessato a quello stato.

Devi solo inviare la notifica all'intersezione di questi gruppi. Ad esempio, tutte le persone nella mia lista di contatti possono vedere il mio stato cambiare. Le persone sono interessate al mio stato solo se sono nella loro lista di contatti e sono online. Se si memorizzano lo stato corrente e l'elenco dei contatti in un database che può essere controllato con una query SQL moderatamente complessa (due join). Ma dati gli indici appropriati, questa query sarà comunque abbastanza veloce anche per una base di utenti di grandi dimensioni.

Alcune applicazioni di chat non visualizzano lo stato di tutti i contatti. Per esempio. l'interfaccia utente di WhatsApp mostra solo questo stato in una chat 1: 1 con quella persona. Ciò significa che le modifiche di stato attivano solo pochissime notifiche, probabilmente nessuna. Ma è più facile pensarci in termini di sottoscrizioni esplicite di un utente allo stato di un altro utente. Il mantenimento di questi abbonamenti richiede pochissima memoria rispetto al costo di un socket aperto.

    
risposta data 04.02.2018 - 17:34
fonte