Proyecto de reactor
La programación reactiva permite construir sistemas resistentes a la alta carga. Manejar mucho tráfico no es un problema porque el servidor no se bloquea y no bloquea los procesos del cliente para esperar respuestas. El cliente no puede observar directamente, o sincronizarse con, la ejecución que ocurre en el servidor. Cuando una API se esfuerza por atender las peticiones, debe responder de forma sensata. No debería dejar de funcionar o soltar mensajes de forma incontrolada. Debe comunicar que está bajo estrés a los componentes de la línea superior y hacer que reduzcan la carga. Esto se conoce como “back-pressure” y es un aspecto importante de la programación reactiva.
He colaborado en este post con Josh Long, compañero de Java Champion, Spring Developer Advocate y, en general, una gran persona en Pivotal. Llevo mucho tiempo utilizando Spring, y Josh fue quien me enseñó por primera vez Spring Boot, en un Devoxx Belgium hace muchas lunas. Somos buenos amigos desde hace tiempo, compartiendo la misma pasión por Java, los desarrolladores y la creación de aplicaciones increíbles.
Ejemplos de programación reactiva
En el ejemplo anterior, tenemos una aplicación que recibe la petición del cliente (usuario). Digamos que la petición es para iniciar sesión. El usuario introduce sus credenciales, y la aplicación necesita primero llamar a la base de datos para recoger las credenciales válidas para ese usuario y realizar alguna validación llamando a dos servicios API externos. Por último, cuando recibe las respuestas de ambas API, la respuesta se envía al usuario (un mensaje de inicio de sesión correcto o fallido). Dado que la aplicación está escrita de forma sincrónica, tenemos tres puntos de bloqueo aquí. Los puntos de bloqueo son las interacciones con la base de datos y dos servicios API externos.
La mayoría de las aplicaciones de hoy en día tienen pools de hilos para hacer frente a este problema. Aún así, los hilos son recursos caros, y debido a varias limitaciones, es imposible tener el número de hilos que coincida con el número de usuarios soportados por la aplicación.
Primavera reactiva
Reactivo, qué palabra tan sobrecargada. Muchas cosas resultan ser mágicamente Reactivas hoy en día. En este post, vamos a hablar de la Programación Reactiva, es decir, un modelo de desarrollo estructurado en torno a flujos de datos asíncronos.
Sé que estás impaciente por escribir tu primera aplicación reactiva, pero antes de hacerlo, hay un par de cosas que debes saber. El uso de la programación reactiva cambia la forma de diseñar y escribir el código. Antes de subirte al tren, es bueno saber hacia dónde te diriges.
Cuando se utiliza la programación reactiva, los flujos de datos van a ser la columna vertebral de su aplicación. Los eventos, los mensajes, las llamadas e incluso los fallos van a ser transmitidos por un flujo de datos. Con la programación reactiva, observas estos flujos y reaccionas cuando se emite un valor.
Así que, en tu código, vas a crear flujos de datos de cualquier cosa y desde cualquier cosa: eventos de clic, peticiones HTTP, mensajes ingeridos, notificaciones de disponibilidad, cambios en una variable, eventos de caché, medidas de un sensor, literalmente cualquier cosa que pueda cambiar o suceder. Esto tiene un efecto secundario interesante en tu aplicación: se vuelve inherentemente asíncrona.
Aplicación de programación reactiva
Aprenderla es difícil, más aún por la falta de buen material. Cuando empecé, intenté buscar tutoriales. Sólo encontré un puñado de guías prácticas, pero sólo arañaban la superficie y nunca abordaban el reto de construir toda la arquitectura en torno a ella. Las documentaciones de las bibliotecas a menudo no ayudan cuando tratas de entender alguna función. Quiero decir, honestamente, mira esto:
Proyecta cada elemento de una secuencia observable en una nueva secuencia de secuencias observables incorporando el índice del elemento y luego transforma una secuencia observable de secuencias observables en una secuencia observable produciendo valores sólo de la secuencia observable más reciente.
He leído dos libros, uno sólo pintó el panorama general, mientras que el otro se sumergió en cómo utilizar la biblioteca Reactive. Terminé aprendiendo la Programación Reactiva de la manera más difícil: descubriéndola mientras construía con ella. En mi trabajo en Futurice llegué a utilizarla en un proyecto real, y tuve el apoyo de algunos compañeros cuando me encontré con problemas.