Ho giocato un po 'con WebSockets e ho iniziato a implementare una piccola chat. L'ultima volta che ho fatto qualcosa del genere era quando non esistevano cose come thread e computer avevano un core singolo. Ho iniziato a pensare a come implementarlo con gli schemi di programmazione di oggi, ma non sono arrivato a nessuna conclusione finale.
Come implementa le funzionalità principali della chat nelle tecniche odierne a livello superiore?
Ora ho il contesto Server, Socket e User. L'utente ha stati Non definito, Connesso, InChat, Disconnesso, Disconnesso, Il mio problema principale è la manutenzione dell'utente:
- Se l'utente non ha detto "ciao" in 5 secondi dopo l'apertura della connessione - > disconnessione
- L'utente non risponde a "ping" con "pong" o almeno 2 minuti - > disconnessione
- L'utente è stato collegato per più di 12 ore - > disconnessione
- All'utente non è stato assegnato il profilo (nickname e / o altri dettagli) dopo 5 minuti di connessione - > disconnessione
- Viene attivato un altro flag specifico del programma che esegue il kickout dell'utente - > disconnetti
La mia attuale implementazione è simile a come è stata fatta in passato. vale a dire. Ho
while(serverRunning)
{
foreach(socket in allSockets)
{
user = allUsers.findUserBySocket(socket);
doMaintenance(user);
}
}
Ora questo funziona troppe volte e blocca e blocca tutti gli utenti e tutti i socket troppo.
Come è implementato oggi? Ad esempio, ad esempio?
- Il socket si collega
- Aggiungi a allSockets
- Aggiungi a tutti gli utenti
- Avvia thread per utente che viene eseguito ogni x secondi ed esegue user.doMaintenance () ?
- Oppure c'è una coda per utente che viene iniettata con azioni come doPongCheckAction , doProfileTimeoutCheckAction , ecc. ogni x secondi (richiede anche thread per utente che svuota costantemente la coda dell'utente) ?
- Oppure c'è il thread di manutenzione che viene eseguito ogni x secondi dopo l'ultima esecuzione e scorre attraverso tutti gli utenti (un po 'come l'implementazione corrente)?
- Oppure c'è un thread che inietta le azioni a tutte le code degli utenti quando c'è troppo tempo quando è stato eseguito lo stesso tipo di azione e altro thread che itera su tutti gli utenti e svuota la coda dell'utente?
- O qualcos'altro o che non è nemmeno basato sulle code? :)