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

È stato utile?

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.

Autorizzato sotto: CC-BY-SA insieme a attribuzione
Non affiliato a StackOverflow
scroll top