2009-09-21 22 views
6

Estoy en el proceso de convertir nuestro código java para usar NIO, pero no estoy seguro de la mejor manera de diseñarlo.¿Mejor modelo para una implementación de NIO?

Mi enfoque inicial fue crear un conjunto de hilos de selector. Los subprocesos se inician/eliminan según sea necesario, y los canales se registran en un subproceso de selección cuando se conectan/aceptan en forma de turno rotativo. Desde allí, cada subproceso bloquea en select(), y cuando se lo despierte ejecutará la devolución de llamada correspondiente asociada a cada canal que tenga una clave seleccionada.

Además de este diseño de "hilo de selector múltiple", también he visto a la gente decir que usa un único hilo de selector y un conjunto de hilos de envío. Cuando una operación de E/S está lista para ejecutarse, el selector notifica una secuencia de despachador, que luego procesa la solicitud. Este modelo tiene el beneficio de no bloquear el hilo de IO, pero ahora estamos forzando a todo el IO en un solo hilo y tratando con la sincronización/una cola de eventos en el despachador.

Además, no podría utilizar un único búfer de byte directo para leer cada canal, pasarlo directamente a la devolución de llamada. En cambio, tendría que copiar los datos cada vez que ocurra una lectura en una matriz y reiniciar. (Creo que ...)

¿Cuál es la mejor manera de implementar esto?

Respuesta

4

Tome una mirada en el patrón Reactor

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

cómo desea que sus selectores para trabajar realmente depende de su caso de uso. (Número de conexiones, tamaño del mensaje, etc.)

¿Cuál es el problema que está tratando de resolver convirtiendo de IO a NIO?

+0

Rendimiento y escalabilidad. Mucho menos hilos, y debería simplificar nuestro diseño. –

+0

El patrón del reactor es una muy buena opción. Hay algunas implementaciones de este diseño que usan múltiples hilos para manejar los eventos de E/S. Estos diseños son malos y anulan el objetivo de las E/S asincrónicas sin bloqueo. Cuando se escribe un diseño para servidores escalables y de alto rendimiento, se deben usar las llamadas de E/S asincrónicas y mantener todo en una cadena: la cadena 'Selector'. –

3

Usted realmente debe mirar en Mina,

http://mina.apache.org/

que resuelve todos los problemas que usted ha mencionado.

+1

Sí, aunque es una buena idea tratar de entender lo que sucede bajo las sábanas. – pjp

+1

Eso es exactamente lo que hice. Realmente no usé Mina en mi proyecto pero aprendí mucho leyendo su implementación. –

1

También eche un vistazo a netty que es muy rápido y con muchas funciones y también se usa en sistemas grandes y en grandes compañías como Redhat (jboss), Twitter, Facebook ....

Cuestiones relacionadas