Reactor (patrón de diseño)

De Wikipedia, la enciclopedia libre
Saltar a: navegación, búsqueda

El patrón de diseño reactor es un patrón de programación concurrente para manejar los pedidos de servicio entregados de forma concurrente a un manejador de servicio desde una o mas entradas. El manejador de servicio demultiplexa los pedidos entrantes y los entrega de forma sincrónica a los manejadores de pedidos asociados.

Estructura[editar]

  • Recursos: Cualquier medio que puede proveer entrada o salida del sistema.
  • Demultiplexor sincrónico de eventos: Utiliza un bucle de eventos para bloquear a todos los recursos. Cuando es posible comenzar una operación sincrónica en un recurso sin necesidad de bloqueo, el demultiplexor lo envia al despachador.
  • Despachador: Maneja la registración y baja de los manejadores de pedidos. Entregando recursos desde el multiplexor al manejador de pedidos asociado.

Propiedades[editar]

Todos los sistemas reactores son, por definición, de un solo hilo, pero pueden existir en entornos multihilos

Beneficios[editar]

Este patrón separa completamente al código especifico de la aplicación de la implementación del reactor, permitiendo que los componentes de la aplicación puedan ser divididos en módulos reutilizables. Además, la llamada sincrónica de los manejadores de pedidos permite concurrencia, "de grano grueso", sin agregar la complejidad de múltiples hilos en el sistema.

Limitaciones[editar]

El patrón reactor puede ser mas difícil de depurar que un patrón procedural, debido a la inversión de control. Además, al llamar a los manejadores de pedidos de forma sincrónica, limita la concurrencia máxima, especialmente en los dispositivos de SMP. La escalabilidad del patrón no esta limitada solamente por esto último, sino también por el demultiplexor. Las llamadas "poll" y "select" Unix tienen un numero máximo de descriptores que pueden ser obtenidos y tienen problemas de rendimiento cuando se trabaja con grandes números de ellos.[1] (Recientemente, se hicieron disponibles variaciones mas escalables de esas interfaces: "/dev/poll" en Solaris, "epoll" en Linux y "kqueue/kevent" en los sistemas basados en BSD, permitiendo la implementación de sistemas de alta performance, con grandes cantidades de descriptores abiertos)

Implementaciones[editar]

Referencias[editar]

  1. Dan Kegel C10K problem