Sto scrivendo un server Java che utilizza socket semplici per accettare le connessioni dai client. Sto usando il modello abbastanza semplice in cui ogni connessione ha il proprio thread leggendo da esso in modalità di blocco. pseudo codice:Un thread per client. Fattibile?
handshake();
while(!closed) {
length = readHeader(); // this usually blocks a few seconds
readMessage(length);
}
cleanup();
(Le discussioni sono creati da un Executors.newCachedThreadPool()
quindi non ci dovrebbe essere alcun overhead significativo nella loro partenza)
So che questo è un po 'di una messa a punto ingenua e non sarebbe davvero scalare bene a molte connessioni se i thread erano thread del sistema operativo dedicati. Tuttavia, ho sentito che più thread in Java possono condividere un thread hardware. È vero?
Sapendo che userò la macchina virtuale Hotspot su Linux, su un server con 8 core e 12 GB di RAM, pensi che questa configurazione funzioni bene per migliaia di connessioni? In caso contrario, quali sono le alternative?
Ogni thread richiederà un po 'di stack, ma se lo trasformo in un modello non bloccante ogni connessione avrà bisogno di più dati sull'heap, come "in che fase di lettura di un messaggio siamo ora", che è attualmente semplicemente determinato dal puntatore dell'istruzione (parola corretta?) di una discussione. La programmazione potrebbe essere un problema però. –
@Bart: lo spazio extra per connessione non è neanche lontanamente grande come una pila; andare a NIO migliorerà la scalabilità. Il costo è che la maggior parte della gente trova più difficile ingannare ciò che sta succedendo (e Java non ha coroutine, che possono essere utilizzate per bilanciare le preoccupazioni). –
Come ha detto edera, la considerazione principale per ridimensionare a migliaia è davvero lo stack che finirà per consumare. D'altra parte, non sono pienamente convinto che la pianificazione sarà un fattore importante. Sarà un fattore, ma forse non così grande come si potrebbe percepire. Se le attività dominanti sono I/O, i thread produrranno prontamente le CPU nella maggior parte dei casi e riceveranno il paging solo se i dati vengono ricevuti. Se ci pensi, quell'immagine non è troppo diversa anche se usi NIO. È solo che un numero maggiore di thread è coinvolto nel chiedere approssimativamente lo stesso numero di cicli della CPU. – sjlee