2009-09-21 14 views
6

Sono in procinto di convertire il nostro codice java per utilizzare NIO, ma non sono sicuro del modo migliore per progettarlo.Il miglior modello per un'implementazione NIO?

Il mio approccio iniziale era quello di creare un pool di thread di selettori. I thread vengono avviati/eliminati secondo necessità e i canali vengono registrati su un thread di selezione quando vengono collegati/accettati in modalità round-robin. Da lì, ogni thread si blocca su select() e quando viene riattivato verrà eseguito il callback appropriato associato a ciascun canale che ha una chiave selezionata.

Oltre a questo disegno "filo multiplo selettore", ho anche visto persone dire di utilizzare un singolo thread di selezione e un pool di thread di invio. Quando un'operazione IO è pronta per essere eseguita, il selettore notifica un thread di dispatcher, che elabora quindi la richiesta. Questo modello ha il vantaggio di non bloccare il thread di I/O, ma ora stiamo forzando tutto l'IO in un singolo thread e gestendo la sincronizzazione/una coda di eventi nel dispatcher.

Inoltre, non sarei in grado di utilizzare un buffer di byte diretto singolo per la lettura di ciascun canale, passandolo direttamente nel callback. Invece dovrei copiare i dati ogni volta che una lettura avviene in un array e resettare. (Penso ..)

Qual è il modo migliore per implementare questo?

risposta

4

Date un'occhiata al modello Reactor

http://gee.cs.oswego.edu/dl/cpjslides/nio.pdf

Come volete che i vostri selettori di lavorare realmente dipende dal vostro caso d'uso. (Numero di connessioni, dimensioni del messaggio, ecc.)

Qual è il problema che si sta tentando di risolvere convertendo da IO a NIO?

+0

Prestazioni e scalabilità. Molto meno thread e dovrebbe semplificare il nostro design. –

+0

Il pattern Reactor è un'ottima scelta. Esistono alcune implementazioni di questo progetto che utilizzano più thread per gestire gli eventi I/O. Questi progetti sono negativi e vanificano lo scopo di I/O asincrono non bloccante. Quando si scrive un progetto per server scalabili e ad alte prestazioni, si desidera utilizzare chiamate I/O asincrone e mantenerle tutte su un solo thread, il thread 'Selector'. –

3

Si dovrebbe guardare in Mina,

http://mina.apache.org/

risolve tutti i problemi che hai citato.

+1

Sì, anche se è una buona idea cercare di capire cosa sta succedendo sotto le copertine. – pjp

+1

Questo è esattamente quello che ho fatto. Non ho usato Mina nel mio progetto ma ho imparato molto leggendo la loro implementazione. –

1

Anche dare un'occhiata a netty che è molto veloce e ricco di funzionalità e viene anche utilizzato in grandi sistemi e da grandi aziende come Redhat (jboss), Twitter, Facebook ....

Problemi correlati