Una breve descripción de los sistemas reactivos

Ha habido muchos rumores sobre los sistemas reactivos en los últimos años. Junto con el rumor viene la colección de ensaladas de palabras clave relevantes como flujos reactivos, extensiones reactivas, programación reactiva, programación reactiva funcional, etc. Si ha estado en la industria de la tecnología el tiempo suficiente, ha visto los altibajos cíclicos de las palabras de moda y acrónimos de vez en cuando. Entonces, ¿todo eso es otra exageración que pronto será fechada?

He escuchado a ingenieros de software descartar los sistemas reactivos como nada más que un alias para los sistemas asincrónicos basados ​​en eventos, al igual que algunos descartan los microservicios como SOA (arquitectura orientada a servicios) menos ESB (bus de servicios empresariales). Si bien las palabras de moda de la tecnología con un significado reinventado a menudo aparecen, veo suficientes rasgos distintivos en los sistemas reactivos para pensar que el nombre no es simplemente otro alias.

¿Qué son los sistemas reactivos?

El Manifiesto Reactivo describe las características esenciales de los sistemas reactivos: receptivos, resilientes, elásticos e impulsados ​​por mensajes. Eso da una imagen de alto nivel y suena un poco genérico. En particular, la capacidad de respuesta, la resiliencia y la elasticidad descritas en el manifiesto son requisitos casi estándar de muchas aplicaciones del mundo real en estos días.

Quizás "impulsado por mensajes" es el requisito que realmente diferencia los sistemas reactivos de otros. Bajo el capó, un sistema reactivo se basa en interacciones a través del paso de mensajes asincrónico que establece límites entre componentes individuales. Un modelo de interacción de este tipo ayuda a allanar el camino hacia el acoplamiento flexible tanto en el tiempo como en la ubicación para la concurrencia y la distribución, respectivamente. Además, permite que el sistema esté equipado integralmente con algún mecanismo sin bloqueo para regular los flujos de datos (más sobre esto a continuación).

Corrientes reactivas

En la construcción de sistemas reactivos, parece haber un enfoque destacado en el que las operaciones de procesamiento de datos se formulan, cuando corresponde, como flujos de flujo composicionales. Eso no es parte de los requisitos del Manifiesto reactivo, pero podría ser el modelo de interacción basado en mensajes inherente en los sistemas reactivos que, naturalmente, favorece un enfoque de modelado centrado en el flujo.

Aparentemente surgió como una iniciativa separada, los flujos reactivos se pueden ver como un tipo específico de sistemas reactivos que se centra en el procesamiento del flujo, expresando los flujos de composición como gráficos dirigidos.

Contrapresión

Uno de los mecanismos reguladores sin bloqueo mencionado anteriormente es la contrapresión. Puede ser la funcionalidad más buscada para los sistemas que implementan flujos reactivos. Es un mecanismo de retroalimentación asincrónico que opera en la dirección opuesta de la corriente hacia los componentes aguas arriba para la regulación de la carga.

Con la contrapresión incorporada que regula los flujos de la corriente sin bloqueo, el sistema puede funcionar con utilizaciones de memoria relativamente más estables. Dicha funcionalidad elimina los problemas de desbordamiento de pila potencialmente devastadores (por ejemplo, causados ​​por un sumidero de datos lento) que normalmente tendrían que ser contrarrestados por un mecanismo de almacenamiento en búfer de datos de creación personalizada a lo largo de los flujos de flujo.

¿Qué pasa con la programación reactiva?

Como paradigma de programación para construir sistemas reactivos, la programación reactiva enfatiza la formulación de lógica de programación asincrónica como flujos de datos y la propagación automática de cambios a valores de variables correlacionadas en el sistema. Los lenguajes utilizados para tal paradigma de programación proporcionarían funciones componibles adecuadas para operar en los flujos formulados.

Por diseño, la programación reactiva favorece el estilo de programación funcional que expresa y resuelve problemas computacionales utilizando funciones componibles. Sin embargo, la existencia del término programación reactiva funcional es anterior a este "movimiento" reactivo en más de una década. FRP tiene un enfoque muy diferente y se centra en el uso de funciones para expresar comportamientos durante un tiempo continuo con una semántica de denotación simple. Sin embargo, ahora a menudo se ve como programación reactiva con un énfasis explícito en la programación funcional.

Si una ilustración con código funciona mejor, recomiendo leer la publicación del tutorial de Andre Staltz que explica la esencia de la programación reactiva en JavaScript usando RxJS.

ReactivoX

ReactiveX, también conocido como Reactive Extensions, es una biblioteca de API que permite el uso de operaciones de composición para manejar flujos de eventos asincrónicos. Extendiéndose desde el patrón del observador, los observables y los observadores (que son suscriptores de los observables) constituyen los ingredientes clave en la biblioteca con un conjunto de operadores componibles para filtrado, transformación, agregación, etc. RxJS y RxJava son dos de las implementaciones más populares de ReactiveX en JavaScript y Java respectivamente.

Actores de Akka

Akka es una biblioteca basada en actores destinada a crear aplicaciones distribuidas y concurrentes escalables en JVM (Java Virtual Machine). En su núcleo, hay primitivas computacionales llamadas actores que mantienen el estado y el comportamiento, y se comunican entre sí a través del paso de mensajes asincrónico.

Escritos en Scala, los actores de Akka son por naturaleza livianos y vagamente acoplados. Eso, junto con las sólidas funciones de enrutamiento, fragmentación y sub-pub de Akka para sistemas distribuidos escalables como IoT, los convierte en una gran plataforma para construir sistemas reactivos.

Arroyos de Akka

Uno de los favoritos (y miembro fundador) de la iniciativa de corrientes reactivas es Akka Streams. Está construido sobre los actores de Akka y proporciona un amplio conjunto de API para construir topologías de transmisión y procesar transmisiones de una manera altamente compositiva. Una publicación reciente de mi blog se centra en los flujos de Akka y cómo se puede usar para realizar una minería de texto básica.

Al parecer, Akka streams como iniciativa reactiva se ha estado esforzando estos días. Los controladores basados ​​en Akka-Streams como Reactive Rabbit y ReactiveMongo para RabbitMQ y MongoDB han comenzado a ganar algo de impulso en la industria de la tecnología. Además, Akka HTTP, que es la próxima generación del kit de herramientas Spray REST / HTTP, también está diseñado para ser habilitado para transmisiones con transmisiones de Akka como motor subyacente.

Todas las transmisiones orientadas, de alguna manera

Con el impulso cada vez mayor en la adopción de la iniciativa de los sistemas reactivos, aparentemente ha superado la etapa de ser una mera exageración. Evidentemente, también es más que una palabra de moda reinventada de sistemas asincrónicos basados ​​en eventos. Desde una perspectiva de méritos técnicos, no veo ninguna razón por la que no se vuelva más prominente. Sin embargo, incluso las iniciativas de tecnología de código abierto son como productos comerciales: un buen momento puede atraer la atención rápidamente en la etapa inicial y el marketing adecuado puede ayudar a ganar el impulso necesario para popularizar a una base de usuarios más amplia.

La programación funcional en cuanto al tiempo ha ido en aumento, así que diría que es un gran momento, ya que el estilo de programación se adopta favorablemente en la construcción de sistemas reactivos. En cuanto al marketing, creo que una denominación más intuitiva y reveladora de la iniciativa se vendería mejor a la industria de la tecnología. Apenas se podía captar algo significativo al escuchar el término "sistemas reactivos" por primera vez. Aunque el término "reactivo" se refiere a algún aspecto de la propagación del cambio adoptado en tales sistemas, no destaca a la audiencia como una característica distintiva.

Con sistemas reactivos, flujos reactivos y programación reactiva orientados predominantemente en torno a flujos, creo que el término "flujo" es una palabra clave más reveladora que "reactivo". Al intercambiar la generalidad con simplicidad e intuición, combinaría sistemas reactivos y flujos reactivos como una sola iniciativa, y reemplazaría "reactivo" con algo que se centre en "flujo".