Reactor (patrón de diseño)
# Reactor (patrón de diseño)

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

## Estructura

* Recursos: cualquier medio que puede proveer entrada o salida del sistema.
* Demultiplexor síncrono de eventos: utiliza un bucle de eventos para bloquear a todos los recursos. Cuando es posible comenzar una operación síncrona en un recurso sin necesidad de bloqueo, el demultiplexor lo envía al despachador.
* Despachador: maneja el registro y la baja de los manejadores de pedidos. Entrega los recursos desde el multiplexor al manejador de pedidos asociado.

## Propiedades

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

## Beneficios

Este patrón separa completamente al código específico 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 síncrona de los manejadores de pedidos permite concurrencia, de grano grueso, sin agregar la complejidad de múltiples hilos en el sistema.

### Limitaciones

El patrón reactor puede ser más difícil de depurar que un patrón procedimental, debido a la inversión de control. Además, al llamar a los manejadores de pedidos de forma síncrona, limita la concurrencia máxima, especialmente en los dispositivos de SMP. La escalabilidad del patrón no está limitada solamente por esto último, sino también por el demultiplexor. Las llamadas poll y select Unix tienen un número máximo de descriptores que pueden ser obtenidos y tienen problemas de rendimiento cuando se trabaja con grandes números de ellos. (Recientemente, se hicieron disponibles variaciones más 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

* The ADAPTIVE Communication Environment (C++)
* Apache MINA (Java)
* Netty (Java)
* xSocket (Java)
* POE (Perl)
* Twisted (Python)
* EventMachine (Ruby)
* Node.js (JavaScript)
* ReactPHP (PHP)
* libowfat (C)
