Strumienie reaktywne

Strumienie reaktywne
Pierwsze wydanie 15 maja 2015 ; 7 lat temu ( 15.05.2015 )
Wersja stabilna
1.0.3 / 23 sierpnia 2019 ; 3 lata temu ( 23.08.2019 )
Magazyn github .com /reactive-streams /reactive-streams-jvm
Napisane w Java (Scala, Groovy, Kotlin), .NET
Strona internetowa reactive-streams .org

Reactive Streams to inicjatywa mająca na celu zapewnienie standardu asynchronicznego przetwarzania strumieni z nieblokującym przeciwciśnieniem.

Pochodzenie

Usługa Reactive Streams powstała pod koniec 2013 roku z inicjatywy inżynierów z firm Netflix , Pivotal i Lightbend . Niektóre z najwcześniejszych dyskusji rozpoczęły się w 2013 roku pomiędzy Play i Akka w Lightbend. Lightbend jest jednym z głównych twórców Reactive Streams. Inni współautorzy to Red Hat , Oracle , Twitter i spray.io.

Cele

Głównym celem strumieni reaktywnych jest zarządzanie wymianą danych strumieniowych przez granicę asynchroniczną – na przykład przekazywanie elementów do innego wątku lub puli wątków – przy jednoczesnym zapewnieniu, że strona odbierająca nie jest zmuszona do buforowania dowolnych ilości danych. Innymi słowy, przeciwciśnienie jest integralną częścią tego modelu, aby umożliwić ograniczenie kolejek pośredniczących między wątkami .

Zamierzeniem specyfikacji jest umożliwienie stworzenia wielu zgodnych implementacji , które dzięki przestrzeganiu zasad będą mogły płynnie współdziałać , zachowując wspomniane korzyści i cechy na całym grafie przetwarzania aplikacji strumieniowej. Wraz ze specyfikacją opracowano ogólnodostępny zestaw zgodności technologii , który umożliwia osobom wdrażającym specyfikację sprawdzenie, czy uwzględniły wszystkie zasady i wymagania, w tym sprawdzenie potencjalnych warunków wyścigowych.

Zakres Reactive Streams to minimalny zestaw interfejsów , metod i protokołów opisujących niezbędne operacje i podmioty, aby uzyskać asynchroniczne strumienie danych z nieblokującym przeciwciśnieniem. DSL użytkownika końcowego lub interfejsy API wiążące protokoły celowo pominięto w zakresie, aby zachęcić i umożliwić różnym implementacjom, które potencjalnie korzystają z różnych języków programowania, zachowanie jak największej wierności idiomom ich platformy.

Włączenie do standardu Java

Specyfikacja opracowana z zamiarem włączenia w przyszłości do oficjalnej biblioteki standardowej Java, jeśli okaże się skuteczna i zostanie przyjęta przez wystarczającą liczbę bibliotek i dostawców.

Doug Lea , lider JSR 166, zaproponował, aby Reactive Streams stały się częścią Java 9 jako nowa klasa Flow, która obejmowałaby interfejsy obecnie dostarczane przez Reactive Streams. Po udanym wydaniu Reactive Streams w wersji 1.0 i rosnącym zastosowaniu, propozycja została zaakceptowana i Reactive Streams zostały włączone do JDK9 poprzez JEP -266.

Przyjęcie

30 kwietnia 2015 została wydana wersja 1.0.0 Reactive Streams dla JVM , zawierająca Java API , specyfikację tekstową , TCK i przykłady implementacji. Zawiera wiele zgodnych implementacji zweryfikowanych przez TCK dla wersji 1.0.0, wymienionych w kolejności alfabetycznej:

Inne implementacje obejmują Cassandra , Elasticsearch , Apache Kafka , Parallel Universe Quasar, Play Framework , Armeria.

Spring 5 będzie zbudowany na rdzeniu reaktora kompatybilnym ze strumieniami Reactive.

Amazon ogłosił, że jego zestaw SDK Amazon Web Services będzie obsługiwał strumienie reaktywne, aby zapewnić możliwości przesyłania strumieniowego w bibliotekach klienckich w wersji 2.0.

Wersja Reactive Streams 1.0.1 została wydana 9 sierpnia 2017 r. i zawierała różne ulepszenia w zakresie precyzji specyfikacji, ulepszenia TCK i inne wyjaśnienia. Specyfikacja oraz interfejsy pozostały w pełni kompatybilne wstecz z wersją 1.0.0, jednakże miały na celu usprawnienie przyjęcia dla przyszłych implementatorów, a także dostosowanie się do niektórych dodatkowych wymagań określonych przez OpenJDK.

Porty i wpływy

  • .NET udostępniono bezpośredni port specyfikacji, interfejsów i TCK .
  • Kiedy w języku Elixir wprowadzono interfejs API przesyłania strumieniowego o nazwie GenStage, autorzy złożyli podziękowania „[do] projektów akka-streams i reactive-streams, które dostarczyły nam wskazówek dotyczących wdrażania wymiany między etapami opartej na popycie”.