El crecimiento de internet en los últimos 25 años es uno de los avances mundiales más significativos a nivel tecnológico. Gracias a su existencia, no solo podemos informarnos en cualquier momento del día y sobre el tema que elijamos, sino que también somos capaces de hacer trámites de todo tipo, gestionar viajes, crear emprendimientos y hasta comunicarnos con quien sea alrededor del globo. Entre los spin-offs más notables de esta red de comunicaciones se encuentran las apps móviles, que hoy son algo así como las “vedettes” de la comunicación en red. A través de ellas nos insertamos en el corazón mismo de cualquier entidad, medio, servicio o plataforma. Ellas también tuvieron su propia evolución; no son las mismas que empezaron tímidamente en el sistema de los teléfonos inteligentes.
Las capacidades de estas apps, sus funciones y también su metamorfosis son parte de este proceso de cambios y renovaciones que se van dando con el avance tecnológico y el crecimiento virtual. En este sentido, la programación reactiva (Reactive Programming) aparece como un paradigma enfocado en el trabajo con flujos de datos finitos o infinitos de manera asíncrona que permite que estos datos se propaguen y generen cambios en la app. Es decir que reaccionan a los datos a la vez que ejecutan una serie de eventos.
La programación reactiva está relacionada con el patrón de diseño Observer cuya premisa es que 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.
Mediante la utilización de la programación asíncrona se logra 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. En cambio, los clientes son notificados de los nuevos datos 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 actividades mientras espera nuevas notificaciones.
Características y beneficios
Responsive: el sistema responde a tiempo en la medida de lo posible. La responsividad es la piedra angular de la usabilidad y la utilidad y significa que los problemas pueden ser detectados rápidamente y tratados efectivamente. Los sistemas responsivos se enfocan en proveer tiempos de respuesta rápidos y consistentes, estableciendo límites superiores confiables para así proporcionar una calidad de servicio consistente. Este comportamiento consistente, a su vez, simplifica el tratamiento de errores, aporta seguridad al usuario final y fomenta una mayor interacción.
Resiliente: el sistema permanece responsive frente a fallos. La resiliencia es alcanzada con replicación, contención, aislamiento y delegación. Los fallos son manejados dentro de cada componente, aislando cada componente de los demás y asegurando así que cualquier parte del sistema pueda fallar y recuperarse sin comprometer el sistema como un todo. La recuperación de cada componente se delega en otro componente (externo) y la alta disponibilidad se asegura con replicación allí donde sea necesario. El cliente de un componente no tiene que responsabilizarse del manejo sus fallos.
Elástico: el sistema se mantiene responsivo bajo variaciones en la carga de trabajo. Los Sistemas Reactivos pueden reaccionar a cambios en la frecuencia de peticiones incrementando o reduciendo los recursos asignados para servir dichas peticiones. Esto implica diseños que no tengan puntos de contención o cuellos de botella centralizados, resultando en la capacidad de dividir o replicar componentes y distribuir las peticiones entre ellos. Los Sistemas Reactivos soportan algoritmos de escalado predictivos, así como Reactivos, al proporcionar relevantes medidas de rendimiento en tiempo real. La elasticidad se consigue de forma rentable haciendo uso de plataformas con hardware y software genéricos.
Orientado a Mensajes: los Sistemas Reactivos confían en el intercambio de mensajes asíncrono para establecer fronteras entre componentes, lo cual asegura bajo acoplamiento, aislamiento y transparencia de ubicación. Estas fronteras también proporcionan los medios para delegar fallos como mensajes. El uso del intercambio de mensajes explícito posibilita la gestión de la carga, la elasticidad, y el control de flujo, gracias al modelado y monitorización de las colas de mensajes en el sistema, y la aplicación de back-pressure cuando sea necesario. La mensajería basada en ubicaciones transparentes como medio de comunicación permite que la gestión de fallos pueda trabajar con los mismos bloques y semánticas a través de un cluster o dentro de un solo nodo. La comunicación No-bloqueante permite a los destinatarios consumir recursos sólo mientras estén activos, llevando a una menor sobrecarga del sistema.
Escalable usando programación reactiva obtenemos una implementación débilmente acoplada escalable y que tiende a aislar los fallos.
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 se puede procesar cargas de trabajo más altas con menos hilos.
¿Cómo se aplica?
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és hacer click aquí para acceder a 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.
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.
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és ampliar información, podés chequear este enlace.
En Pigmalion Software trabajamos con Quarkus, un framework Java sponsoreado por Red Hat, pensado para la nube, de bajo footprint de memoria y rápido inicio, que además permite conjugar el paradigma reactivo con el tradicional. Su adopción nos ha permitido desarrollar sistemas más robustos, escalables y resilientes, permitiendo además un ciclo de desarrollo más fluido. Recientemente, Gustavo Gramajo-nuestro Arquitecto de Software- brindó un webinar al respecto, estén atentos a nuevas ediciones.
