Vorwort
Am 28. Oktober 2005 schickte der damals neu ernannte Chefarchitekt von Microsoft, Ray Ozzie, ein berühmt-berüchtigtes Memo mit dem Titel "The Internet Services Disruption" per E-Mail an seine Mitarbeiter. In diesem Memo skizziert Ray Ozzie, wie die Welt heute aussieht, wo Unternehmen wie Microsoft, Google, Facebook, Amazon und Netflix das Internet als Hauptkanal für die Bereitstellung ihrer Dienste nutzen.
Aus der Perspektive eines Entwicklers hat Ozzie eine ziemlich bemerkenswerte Aussage für einen Geschäftsführer eines großen Unternehmens gemacht:
Komplexität ist tödlich. Sie raubt Entwicklern das Leben, erschwert die Planung, Erstellung und Prüfung von Produkten, bringt Sicherheitsprobleme mit sich und frustriert Endnutzer und Administratoren.
Zunächst einmal müssen wir bedenken, dass die großen IT-Unternehmen im Jahr 2005 sehr verliebt in unglaublich komplizierte Technologien wie SOAP, WS-* und XML waren. Damals war das Wort "Microservice" noch nicht erfunden, und es gab keine einfache Technologie, die Entwicklern dabei helfen konnte, komplexe Dienste asynchron aus kleineren Diensten zusammenzusetzen und mit Problemen wie Ausfällen, Latenz, Sicherheit und Effizienz umzugehen.
Für mein Cloud-Programmierbarkeitsteam bei Microsoft war Ozzie's Memo ein unsanfter Weckruf, sich auf die Erfindung eines einfachen Programmiermodells für den Aufbau großer asynchroner und datenintensiver Internetdienstarchitekturen zu konzentrieren. Nach vielen Fehlstarts dämmerte uns schließlich, dass wir durch die Dualisierung der Iterable/Iterator-Schnittstelle für synchrone Sammlungen ein Schnittstellenpaar zur Darstellung asynchroner Ereignisströme erhalten könnten, mit allen bekannten Sequenzoperatoren wie map, filter, scan, zip, groupBy usw. zur Umwandlung und Kombination asynchroner Datenströme. So wurde Rx irgendwann im Sommer 2007 geboren. Während der Implementierung wurde uns klar, dass wir die Gleichzeitigkeit und die Zeit verwalten mussten, und deshalb haben wir die Idee der Java-Executors um virtuelle Zeit und kooperatives Re-Scheduling erweitert.
Nach einem intensiven zweijährigen Hackathon, bei dem wir zahlreiche Designoptionen ausprobiert haben, haben wir Rx.NET am 18. November 2009 zum ersten Mal ausgeliefert. Bald darauf haben wir Rx auf Microsoft.Phone.Reactive für Windows Phone 7 portiert und begonnen, Rx in verschiedenen anderen Sprachen wie JavaScript und C++ zu implementieren. Außerdem haben wir mit experimentellen Versionen in Ruby und Objective-C experimentiert.
Der erste Rx-Nutzer bei Microsoft war Jafar Husain, der die Technologie mitbrachte, als er 2011 zu Netflix kam. Jafar hat Rx im Unternehmen bekannt gemacht und schließlich den Client-Stack der Netflix-Benutzeroberfläche so umgestaltet, dass er die asynchrone Stream-Verarbeitung vollständig einbezieht. Zum Glück für uns alle konnte er seinen Enthusiasmus an Ben Christensen weitergeben, der an der Netflix-API auf der mittleren Ebene arbeitete. Da Netflix auf der mittleren Ebene Java verwendet, begann Ben 2012 mit der Arbeit an RxJava und verschob die Codebasis Anfang 2013 auf Github, um sie als Open Source weiterzuentwickeln. Ein weiterer früher Anwender von Rx bei Microsoft war Paul Betts. Als er zu Github wechselte, konnte er seine Kollegen bei Github wie Justin Spahr-Summers davon überzeugen, ReactiveCocoa für Objective-C zu implementieren und im Frühjahr 2012 zu veröffentlichen.
Als Rx in der Branche immer beliebter wurde, konnten wir Microsoft Open Tech davon überzeugen, Rx .NET im Herbst 2012 als Open Source zu veröffentlichen. Kurz darauf verließ ich Microsoft, um Applied Duality zu gründen und mich zu 100 % darauf zu konzentrieren, Rx zur sprach- und plattformübergreifenden Standard-API für asynchrone Echtzeit-Datenstromverarbeitung zu machen.
Im Jahr 2016 ist die Popularität und Nutzung von Rx sprunghaft angestiegen. Der gesamte Datenverkehr über die Netflix-API basiert auf RxJava, ebenso wie die Hystrix-Fehlertoleranzbibliothek, die den gesamten internen Dienstverkehr abschottet. Mit den verwandten reaktiven Bibliotheken RxNetty und Mantis hat Netflix nun einen vollständig reaktiven Netzwerkstack für die Verbindung aller internen Dienste über Maschinen- und Prozessgrenzen hinweg geschaffen. Auch im Android-Bereich ist RxJava sehr erfolgreich: Unternehmen wie SoundCloud, Square, NYT und Seatgeek nutzen RxJava für ihre Android-Apps und tragen zur RxAndroid-Erweiterungsbibliothek bei. noSQL-Anbieter wie Couchbase und Splunk bieten ebenfalls Rx-basierte Bindungen für ihre Datenzugriffsschicht an. Andere Java-Bibliotheken, die RxJava übernommen haben, sind unter anderem Camel Rx, Square Retrofit und Vert.x. In der JavaScript-Community ist RxJS weit verbreitet und unterstützt beliebte Frameworks wie Angular 2. Die Community unterhält eine Website, auf der du Informationen über Rx-Implementierungen in vielen Sprachen sowie fantastische Marble Diagram Artworks und Erklärungen von David Gross (@CallHimMoorlock) finden kannst.
Seit seiner Einführung hat sich Rx mit den Bedürfnissen und dem Input der Entwicklergemeinschaft weiterentwickelt. Die ursprüngliche Implementierung von Rx in .NET konzentrierte sich auf die Umwandlung asynchroner Ereignisströme und verwendete asynchrone Enumerable für Szenarien, die einen Rückstau benötigten. Da Java keine Sprachunterstützung für asynchrones Warten bietet, hat die Community die Typen Observer und Observable um das Konzept des reaktiven Pulls erweitert und die Schnittstelle Producer eingeführt. Dank vieler Open-Source-Mitwirkenden ist auch die Implementierung von RxJava äußerst ausgefeilt und hoch optimiert.
Auch wenn sich die Details von RxJava etwas von denen anderer Rx-Implementierungen unterscheiden, ist es doch speziell für alle Entwickler entwickelt worden, die in der schönen neuen Welt der verteilten Echtzeit-Datenverarbeitung überleben und sich auf die wesentliche Komplexität konzentrieren wollen, ohne dass die zufällige Komplexität ihnen das Leben aussaugt. Dieses Buch ist ein tiefes und gründliches Eintauchen in die Konzepte und Anwendungen von RxJava im Besonderen und Rx im Allgemeinen durch zwei Autoren, die unzählige Stunden Erfahrung mit der Implementierung und dem Einsatz von RxJava in der realen Welt haben. Wenn du "reaktiv" werden willst, gibt es keinen besseren Weg als den, dieses Buch zu kaufen.
Get Reaktive Programmierung mit 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.