¿Alguna vez escuchaste hablar sobre programación reactiva o sistemas reactivos y no te quedó claro a qué se refiere? ¿Tenés dudas sobre algunos de sus conceptos? ¡En esta serie de posts cubriremos desde sus conceptos básicos hasta una implementación práctica!
Hace tiempo atrás (varios meses) me topé con un tema que si bien no es nuevo, me llamó mucho la atención: programación reactiva. Me encantaron los conceptos y principios que proponía para solucionar problemas como performance y tiempos de respuesta en situaciones de gran concurrencia de usuarios o enormes volúmenes de información a procesar. Luego de buscar mucha información al respecto, hacer un par de cursos del tema y proyectos prácticos para entender cómo funciona este paradigma, decidí crear esta serie de posts para transmitir todo lo que aprendí sobre programación reactiva. De modo que… ¡Empecemos!
¿A qué nos referimos con programación reactiva?
La programación reactiva es un paradigma de programación donde los protagonistas principales son el procesamiento de flujos de información de forma asincrónica y la propagación del cambio, esto es, la modificación del entorno en base a «reacciones» de distintos estímulos.
Concentrémonos en la propagación del cambio y un ejemplo práctico para ponernos mas a tono en el tema, valiéndonos también de conceptos como sincronía/asincronía: Hagamos planes para cenar pasta con un amig@
Ejemplo Sincrónico:
- Llamamos a nuestr@ amig@.
- Cocinamos salsa.
- Cocinamos la pasta.
- Comemos.
- Llega la visita.
En este primer caso, hacemos todos los pasos de forma secuencial: esperamos a que una tarea termine para poder proseguir con la siguiente. Presenta problemas, ya que comemos antes de que llegue la visita (¡qué desconsiderados!) e incluso podemos mejorar el proceso.
Ejemplo Asincrónico:
- Llamamos a nuestr@ amig@.
- Cocinamos la salsa
Cocinamos la pasta mientras la salsa se cocina. - Comemos.
- Llega la visita.
En un enfoque asincrónico, ejecutamos tareas de forma simultánea, lo que supone una mejora al proceso sincrónico. En éste caso, cocinamos tanto la salsa como la pasta al mismo tiempo para ahorrar pasos, y por lo tanto, tiempo. Pero hay un problema: seguimos sin esperar a nuestr@ invitad@.
Ejemplo Reactivo:
- Llamamos a nuestr@ amig@.
- cocinamos la salsa
Cocinamos la pasta mientras la salsa se cocina. - Esperamos a que llegue la visita y comemos.
En éste último enfoque, esperamos hasta que nuestra visita llegue para poder comenzar a comer. Reaccionamos ante un estímulo: ya estamos listos para comer, pero hasta que no llegue nuestra visita no comenzaremos. La llegada de nuestra visita, es el estímulo que necesitamos para poder seguir con los pasos del proceso.
Es con éste ejemplo que vemos los puntos claves de la programación reactiva: la asincronía de procesos al cocinar 2 cosas al mismo tiempo y la reacción a eventos del entorno con la llegada de la visita, que nos permite seguir los pasos.
¿Como se refleja ésto en una app real? Creando múltiples hilos de ejecución asincrónicos que van reaccionando entre sí a raíz de cambios o eventos que se van produciendo durante la ejecución del proceso.
La reactividad, es la capacidad de reaccionar a eventos del entorno, mientras que la asincronía, es la cualidad de distribuir tareas y ejecutarlas en paralelo.
¿Qué ventajas ofrece?
Ok, analizando un poco el último ejemplo, podemos observar claras ventajas, como los tiempos de respuesta.
En aplicaciones reales, la programación reactiva nos brinda:
- ✅ Mejoras en la performance: al estar enfocado en procesamiento asincrónico, nos permite procesar grandes volúmenes de información de forma rápida.
- ✅ Mejoras en tiempos: al aplicar tareas de forma simultánea, los tiempos de respuesta totales se ven disminuidos considerablemente. En sistemas web con alta interacción con el usuario, como por ejemplo SPAs (Single Page Applications), ésta ventaja es crucial, ya que nos permite interactuar con el usuario de forma veloz y sin bloqueos/espera de respuestas.
- ✅ Modificaciones simples: en aplicaciones que implementan programación reactiva, cada parte del flujo cumple una responsabilidad particular que se integra con el resto para formar un todo. Esta modularidad nos permite añadir cambios donde sea necesario de forma simple.
¡Guau! ¿y esto no tiene desventajas?
Bien, esto es un punto aparte. Si bien la programación reactiva nos presenta muchas ventajas, hay dos características a tener en cuenta al momento de implementarla:
- ⚠️ Curva de aprendizaje: aplicar programación reactiva es complicado, hay poca documentación al respecto y la implementación es muy diferente al que estamos acostumbrado
- ⚠️ Posibles leaks de memoria: el procesamiento de tareas en paralelo y la propia naturaleza de éste enfoque en el que tendemos a crear grandes cantidades de hilos, resulta ser nada «barato» hablando en términos de recursos. Si bien se nos presentan formas de evitar estos consumos excesivos a través de diferentes técnicas que veremos en futuros posts (tales como backpressure), de no hacerlo tendremos un grave problema de RAM y CPU consumida.
Ok, entonces: ¿cuándo me conviene usar RP?
Debido a las ventajas que comentamos, aplicar programación reactiva sirve para casos donde la concurrencia de usuarios es extremadamente elevada o en comunicación de información en tiempo real (chats, apps de streaming). También resulta ser una opción a tener en cuenta en aplicaciones server-side con un gran volumen de información a procesar, o donde los tiempos de respuesta sean críticos y se espera que sean lo mas rápidos posible.
En casos donde no apliquen estas características, lo aconsejable es no complejizar el desarrollo e implementar un enfoque tradicional en lugar de programación reactiva.
Sistemas Reactivos
Hay un punto en particular respecto a la programación reactiva que genera mucha confusión en las redes, y es definir a los Sistemas Reactivos como aplicaciones que implementan programación Reactiva, cuando es realidad no es así: los sistemas reactivos, son aquellos que, implementando una arquitectura y diseño determinados, permiten que múltiples aplicaciones se comporten como una «única y gran aplicación», reaccionando entre sí y manteniéndose alerta a cambios del resto, pudiendo incluso balancear sus cargas y escalar en infraestructura proactivamente.
Sistemas Reactivos ➡ Diseño y Arquitectura ➡ Conjunto de sistemas individuales
Programación Reactiva ➡ Desarrollo ➡ Sistema individual
Los Sistemas Reactivos están basados en mensajes y comunicación entre sistemas individuales, mientras que la Programación Reactiva se basa en el procesamiento de eventos locales de un sistema individual
¿Qué buscan los sistemas reactivos?
El manifiesto de los sistemas reactivos, un documento publicado en 2013 sobre lineamientos y principios esenciales a seguir en cuanto a Reactividad se refiere establece que los sistemas reactivos:
- Deben ser responsivos: con foco en responder de la manera más ágil posible.
- Deben ser resilientes: en caso de fallas, debe mantenerse responsivos. Las fallas son contenidas dentro de cada componente del sistema, y se aíslan respecto del resto, de modo que si un componente falla, no afecta directamente al resto ni al comportamiento general del sistema.
- Deben ser elásticos: los sistemas reactivos se mantienen responsivos incluso ante grandes cargas de trabajo. Esta elasticidad se logra reaccionando a las variaciones de peticiones al sistema, permitiendo incrementar/reducir los recursos asignados al momento de servirlas, así como también replicar, subdividir y balancear la carga entre componentes. El resultado? Sistemas sin cuellos de botella ni bloqueos/esperas de respuesta entre sus componentes.
- Son orientados a mensajes: para cumplir con el principio de resiliencia, los sistemas reactivos establecen «límites/fronteras» de responsabilidades entre los componentes del mismo, y basan su funcionamiento en la comunicación de mensajes entre ellos.

¡Genial! ¿Como puedo implementar Programación Reactiva?
En el siguiente post nos centraremos en aspectos técnicos de este paradigma aplicándolo a Java, los distintos frameworks que tenemos a disposición y conceptos de uso y teoría básicos antes de pasar a un ejemplo práctico más complejo.
¡Estate atento! Y si llegaste hasta acá, gracias por leer el post, espero que te haya sido de ayuda 😉
Si tenes dudas, sugerencias o info adicional que te interese compartir, no dudes en escribir en la sección de comentarios 👇
Muy bueno! Gracias!
Me gustaMe gusta