Come progettare un server con molte connessioni persistenti
-
20-08-2019 - |
Domanda
Sto progettando un'applicazione in cui molti client si connettono a un server centrale. Questo server mantiene queste connessioni, inviando keep-alive ogni mezz'ora. Il server ha un server HTTP incorporato, che fornisce un'interfaccia alle connessioni client (ad es. http: // server / isClientConnected ? id = id ). Mi chiedevo quale sia il modo migliore per farlo. La mia attuale implementazione è in Java e ho solo una mappa con ID come chiave, ma viene avviato un thread per ogni connessione e non so se questo è davvero il modo migliore per farlo. Qualsiasi suggerimento sarebbe apprezzato.
Grazie,
Isaac Waller
Soluzione
Utilizzare il pacchetto java.nio, come descritto in questa pagina: Creazione di server altamente scalabili con Java NIO . Leggi anche questa pagina con molta attenzione: Architettura di un server basato su NIO altamente scalabile .
Personalmente non mi preoccuperei degli interni NIO e utilizzerei un framework come Apache MINA o xSocket . NIO è complicato e facile da sbagliare in modi molto oscuri. Se vuoi che & Quot; semplicemente funzioni & Quot; quindi usa un framework.
Altri suggerimenti
Con un singolo thread per connessione, in genere è possibile ridimensionare fino a circa 10.000 connessioni su un singolo computer. Per un computer con Windows 32, probabilmente raggiungerai un limite di circa 1.000 connessioni.
Per evitare ciò, è possibile modificare il design del programma oppure ridimensionare (orizzontale). Devi soppesare il costo dello sviluppo con il costo dell'hardware.
Il singolo thread per utente, con una singola connessione continua è di solito il modello di programmazione più semplice. Starei con questo modello fino a raggiungere i limiti del tuo hardware attuale. A quel punto, deciderei di modificare il codice o aggiungere altro hardware.
Se i client saranno connessi per lunghi periodi di tempo, l'allocazione di un thread per client può essere problematica. Ogni thread sul server richiede una certa quantità di risorse (memoria per lo stack, ad esempio).
È possibile utilizzare Continuazioni del molo per gestire la richiesta del client con meno thread utilizzando servlet asincroni.
Ulteriori informazioni sul modello Reactor. C'è un'implementazione per questo in Java (usa canali invece di thread per client). È facile da implementare e molto efficiente.