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?
Rendimiento y escalabilidad. Mucho menos hilos, y debería simplificar nuestro diseño. –
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'. –