La programación reactiva, o Reactive Programming, es un paradigma enfocado en el trabajo con flujos de datos finitos o infinitos de manera asíncrona, permitiendo que estos datos se propaguen generando cambios en la aplicación, es decir, “reaccionan” a los datos ejecutando una serie de eventos. Hoy, nuestro Slashboy Gerardo Astone, nos habla sobre esta manera de programar, cuáles son sus características, beneficios y cómo aplicarla. ¡Vamos a por ello!
La programación reactiva está relacionada con el patrón de diseño Observer: cuando hay un cambio de estado en un objeto, los otros objetos son notificados y actualizados acorde. Por lo tanto, en lugar de sondear eventos para los cambios, los eventos se realizan de forma asíncrona para que los observadores puedan procesarlos.
Utilizando programación asíncrona, la idea es simple: disminuir el uso ineficiente de recursos usando recursos que, de lo contrario, estarían inactivos, ya que permanecen a la espera de actividad de algún componente. Los nuevos datos se notifican a los clientes en vez de tener que solicitarlos, debido a que la entrada y salida de datos es asíncrona. Por ello se invierte el diseño normal del procesamiento de entrada y salida. Este enfoque libera al cliente para hacer otras cosas mientras espera nuevas notificaciones.
Características de la programación reactiva
La principales características que ofrece la programación reactiva, y por lo cual se está convirtiendo en tendencia, es que permite que los sistemas sean:
- Responsivos: aseguran la calidad del servicio cumpliendo unos tiempos de respuesta establecidos. Además define límites en dichos tiempos de respuesta, de forma que los problemas pueden ser detectados rápidamente y tratados de forma efectiva
- Resilientes: se mantienen responsivos incluso cuando se enfrentan a situaciones de error.
- Elásticos: se mantienen responsivos incluso ante aumentos en la carga de trabajo.
- Orientados a mensajes: minimizan el acoplamiento entre componentes al establecer interacciones basadas en el intercambio de mensajes de manera asíncrona. Afectando (de manera positiva) todo el sistema.
Beneficios de la programación reactiva
Entre los principales beneficios de aplicar este tipo de programación se encuentran:
Escalabilidad: Usando programación reactiva obtenemos una implementación débilmente acoplada escalable y que tiende a aislar los fallos. La escalabilidad se refiere a la capacidad de escalar horizontalmente y de forma rápida. Para quien no lo sabe un sistema escala horizontalmente si al agregar más nodos al mismo, el rendimiento de éste mejora. Por ejemplo, al añadir una computadora nueva a un sistema que balancee la carga entre la antigua y la nueva puede mejorar el rendimiento de todo el sistema. Esto aplica también en la programación, bien sea con servicios del lado del backend o módulos y/o componentes del lado del frontend.
Ahorro: La utilización eficiente de los recursos, deriva en gastar menos dinero en servidores y centros de datos. La promesa de la programación reactiva es que se puede hacer más con menos. Específicamente puedes procesar cargas de trabajo más altas con menos hilos.
¿Cómo aplicar la programación reactiva?
Ahora lo que a todos (los developers) nos interesa… ¿Cómo aplicar la programación reactiva en nuestras tecnologías?
Para los que utilizan Java, las dos librerías recomendadas por la comunidad son:
RxJava: esta librería, y su versión 1.x fueron las pioneras en el desarrollo reactivo Java, (actualmente van por la versión 3). Se encuentran completamente integradas en frameworks como Spring MVC, Spring Cloud y Netflix OSS. Podéis echar un vistazo aquí si queréis más información al respecto.
Project Reactor: Fue concebida con la implicación del equipo responsable de RxJava 2, por lo que comparten gran parte de la base arquitectónica. Su principal ventaja es que al ser parte de Pivotal ha sido la elegida como fundación del futuro Spring 5 WebFlux Framework. Este API introduce los tipos Flux y Mono como implementaciones de Publisher, los cuales generan series de 0…N y 0…1 elementos respectivamente. Si os ha sabido a poca, aquí tenéis más información.
Para quienes utilizan frameworks de Javascript, las recomendaciones son:
React + redux-saga: es un framework reactivo en sí, y se maneja integrando un estado global a la aplicación el cual es actualizado mediante efectos colaterales. Toda la información aquí.
NgRx: es un marco para construir aplicaciones reactivas en Angular. Proporciona administración de estados para crear aplicaciones explícitas mantenibles, almacenando un solo estado y el uso de acciones para expresar cambios de estado, además de aislamiento de efectos secundarios, administración de recopilación de entidades y enlaces de enrutadores. Si queréis ampliar información, podéis echar un vistazo en este enlace.