Prólogo

El 28 de octubre de 2005, el entonces recién nombrado arquitecto jefe de Microsoft, Ray Ozzie, envió por correo electrónico a su personal un memorándum ahora infame con el tema "La disrupción de los servicios de Internet". En este memorándum, Ray Ozzie esboza básicamente cómo es el mundo actual, en el que empresas como Microsoft, Google, Facebook, Amazon y Netflix utilizan la Web como principal canal de prestación de sus servicios.

Desde el punto de vista de los desarrolladores, Ozzie hizo una declaración bastante notable para un ejecutivo de una gran empresa:

La complejidad mata. Les chupa la vida a los desarrolladores, hace que los productos sean difíciles de planificar, construir y probar, introduce problemas de seguridad y provoca la frustración del usuario final y del administrador.

En primer lugar, tenemos que tener en cuenta que en 2005, las grandes empresas de TI estaban profundamente enamoradas de tecnologías alucinantemente complicadas como SOAP, WS-* y XML. Era una época en la que aún no se había inventado la palabra "microservicio", y no había ninguna tecnología sencilla en el horizonte que ayudara a los desarrolladores a gestionar la complejidad de componer asíncronamente servicios complejos a partir de otros más pequeños, y a hacer frente a problemas como el fallo, la latencia, la seguridad y la eficiencia.

Para mi Equipo de Programabilidad de la Nube en Microsoft, el memorándum de Ozzie fue una brusca llamada de atención para que nos centráramos en inventar un modelo de programación sencillo para construir arquitecturas de servicios de Internet asíncronos y con gran cantidad de datos a gran escala. Después de muchos comienzos en falso, finalmente nos dimos cuenta de que dualizando la interfaz Iterable/Iterator para colecciones síncronas, podríamos obtener un par de interfaces para representar flujos de eventos asíncronos, con todos los operadores de secuencia familiares como map, filter, scan, zip, groupBy, etc. para transformar y combinar flujos de datos asíncronos, y así nació Rx en algún momento del verano de 2007. Durante el proceso de implementación nos dimos cuenta de que necesitábamos gestionar la concurrencia y el tiempo, y para ello ampliamos la idea de los ejecutores de Java con tiempo virtual y reprogramación cooperativa.

Tras un intenso hackathon de dos años en el que exploramos numerosas opciones de diseño, lanzamos Rx.NET por primera vez el 18 de noviembre de 2009. Poco después portamos Rx a Microsoft.Phone.Reactive para Windows Phone 7 y empezamos a implementar Rx en otros lenguajes, como JavaScript y C++, y probamos versiones experimentales en Ruby y Objective-C.

El primer usuario de Rx dentro de Microsoft fue Jafar Husain, y se llevó la tecnología consigo cuando se incorporó a Netflix en 2011. Jafar evangelizó Rx dentro de la empresa, y finalmente rediseñó la pila del lado del cliente de la interfaz de usuario de Netflix para adoptar plenamente el procesamiento de flujo asíncrono. Además, afortunadamente para todos nosotros, consiguió transmitir su entusiasmo a Ben Christensen, que estaba trabajando en la API de nivel intermedio de Netflix y, dado que Netflix utiliza Java en el nivel intermedio, Ben empezó a trabajar en RxJava en 2012 y trasladó el código base a Github a principios de 2013 para continuar con el desarrollo de código abierto. Otro de los primeros en adoptar Rx en Microsoft fue Paul Betts y, cuando se trasladó a Github, consiguió convencer a sus colegas de Github, como Justin Spahr-Summers, para que implementaran y publicaran ReactiveCocoa para Objective-C en la primavera de 2012.

Cuando Rx se hizo más popular en el sector, convencimos a Microsoft Open Tech para que abriera Rx .NET en otoño de 2012. Poco después, dejé Microsoft para fundar Applied Duality y dedicar el 100% de mi tiempo a convertir Rx en la API estándar entre lenguajes y plataformas para el procesamiento asíncrono de flujos de datos en tiempo real.

En 2016, la popularidad y el uso de Rx se han disparado. Todo el tráfico a través de la API de Netflix se basa en RxJava, al igual que la biblioteca de tolerancia a fallos Hystrix que bloquea todo el tráfico de servicios internos, y a través de las bibliotecas reactivas relacionadas RxNetty y Mantis, Netflix está creando ahora una pila de red completamente reactiva para conectar todos los servicios internos a través de los límites de máquinas y procesos. RxJava también tiene mucho éxito en el espacio Android, con empresas como SoundCloud, Square, NYT, Seatgeek, todas ellas utilizando RxJava para sus aplicaciones Android y contribuyendo a la biblioteca de extensiones RxAndroid. Los proveedores noSQL como Couchbase y Splunk también ofrecen enlaces basados en Rx para su capa de acceso a datos. Otras bibliotecas Java que han adoptado RxJava, entre otras, son Camel Rx, Square Retrofit y Vert.x. En la comunidad JavaScript, RxJS se utiliza ampliamente y potencia marcos populares como Angular 2. La comunidad mantiene un sitio web donde puedes encontrar información sobre implementaciones de Rx en muchos lenguajes, así como fantásticas ilustraciones y explicaciones del Diagrama de Mármol de David Gross (@CallHimMoorlock).

Desde su creación, Rx ha evolucionado con las necesidades y las aportaciones de la comunidad de desarrolladores. La implementación original de Rx en .NET se centraba directamente en la transformación de flujos de eventos asíncronos, y utilizaba enumerables asíncronos para los escenarios que necesitaban espera. Como Java no tiene soporte de lenguaje para await asíncrono, la comunidad amplió los tipos Observador y Observable con el concepto de pull reactivo e introdujo la interfaz Productor. Gracias a muchos colaboradores de código abierto, la implementación de RxJava también es extremadamente sofisticada y está muy optimizada.

Aunque los detalles de RxJava son ligeramente diferentes a los de otras implementaciones de Rx, está especialmente diseñado para todos los desarrolladores que necesitáis sobrevivir en el nuevo mundo del procesamiento de datos distribuidos en tiempo real y centraros en la complejidad esencial sin complejidades accidentales que os chupen la vida. Este libro es una inmersión profunda y minuciosa en los conceptos y usos de RxJava en particular y de Rx en general por parte de dos autores que cuentan con incontables horas de experiencia en la implementación y el uso de RxJava en el mundo real. Si quieres ser "reactivo", no hay mejor manera que comprar este libro.

Get Programación Reactiva con RxJava now with the O’Reilly learning platform.

O’Reilly members experience books, live events, courses curated by job role, and more from O’Reilly and nearly 200 top publishers.