rxjava2 - Diferencia entre la API RxJava y la API Java 9 Flow
rxjava tutorial (4)
¿Cuáles son las principales diferencias entre estas dos bibliotecas?
La API Java 9 Flow no es una biblioteca independiente, sino un componente de la biblioteca Java Standard Edition y consta de 4 interfaces adoptadas a partir de la especificación
Reactive Streams
establecida a principios de 2015. En teoría, su inclusión puede permitir usos específicos en JDK, como el HttpClient de incubación, tal vez la conexión de base de datos Async planificada en partes, y por supuesto
SubmissionPublisher
.
RxJava es una biblioteca de Java que utiliza el diseño de API de estilo ReactiveX para proporcionar un amplio conjunto de operadores sobre flujos de datos reactivos (push).
La versión 2, a través de
Flowable
y varios
XxxProcessor
s, implementa la API Reactive Streams que permite que otras bibliotecas compatibles consuman instancias de
Flowable
y, a su vez, uno puede envolver cualquier
Publisher
en un
Flowable
para consumirlos y componer el conjunto rico de operadores con ellos. .
Por lo tanto, la API Reactive Streams es la especificación de interfaz mínima y RxJava 2 es una implementación de la misma, además RxJava declara un gran conjunto de métodos adicionales para formar una API rica y fluida propia.
RxJava 1 inspiró, entre otras fuentes, la especificación de Reactive Streams, pero no pudo aprovecharla (tenía que seguir siendo compatible). RxJava 2, al ser una reescritura completa y una versión principal separada, podría adoptar y usar la especificación Reactive Streams (e incluso ampliarla internamente, gracias al proyecto Rsc ) y se lanzó casi un año antes de Java 9. Además, se decidió que tanto v1 como v2 siguen soportando Java 6 y, por lo tanto, muchos tiempos de ejecución de Android. Por lo tanto, no podía capitalizar directamente en la API de flujo proporcionada ahora por Java 9 directamente, sino solo a través de un bridge . Tal puente es requerido y / o provisto en otras bibliotecas basadas en Reactive Streams también.
RxJava 3 puede apuntar a la API Java 9 Flow, pero esto aún no se ha decidido y, dependiendo de las características que traigan las versiones posteriores de Java (es decir, los tipos de valor), es posible que no tengamos v3 dentro de un año más o menos.
Hasta entonces, hay una biblioteca prototipo llamada Reactive4JavaFlow que implementa la API Flow y ofrece una API fluida rica en estilo ReactiveX sobre ella.
¿Por qué alguien usaría la biblioteca Java 9 Flow sobre la biblioteca RxJava mucho más diversa o viceversa?
Flow API es una especificación de interoperación y no una API de usuario final.
Normalmente, no lo usaría directamente, sino para pasar flujos a varias implementaciones del mismo.
Cuando se discutió JEP 266, los autores no encontraron ninguna API de biblioteca existente lo suficientemente buena como para tener algo predeterminado con Flow API (a diferencia del rico
java.util.Stream
).
Por lo tanto, se decidió que los usuarios tendrán que confiar en implementaciones de terceros por ahora.
Debe esperar a que las bibliotecas reactivas existentes admitan la API Flow de forma nativa, a través de su propia implementación puente o nuevas bibliotecas para implementar.
Proporcionar un amplio conjunto de operadores a través de Flow API es solo la razón por la que una biblioteca lo implementaría. Los proveedores de fuentes de datos (es decir, controladores de bases de datos reactivas, bibliotecas de red) pueden comenzar a implementar sus propios accesores de datos a través de la API Flow y confiar en las bibliotecas ricas para envolverlos y proporcionarles la transformación y coordinación sin obligar a todos a implementar todo tipo de estos operadores .
En consecuencia, una mejor pregunta es, ¿debería comenzar a usar la interoperación basada en Flow API ahora o apegarse a las secuencias reactivas?
Si necesita soluciones confiables y de trabajo relativamente pronto, le sugiero que se quede con el ecosistema de Reactive Streams por ahora. Si tienes mucho tiempo o quieres explorar cosas, puedes comenzar a usar la API Flow.
Parece que en cada iteración de Java en las últimas versiones principales, hay formas consistentemente nuevas de administrar tareas concurrentes.
En Java 9, tenemos la API Flow que se asemeja a la API Flowable de RxJava pero con Java 9 tiene un conjunto mucho más simple de clases e interfaces.
Java 9
Tiene un
Flow.Publisher
,
Flow.Subscriber
,
Flow.Processor
,
Flow.Subscription
y
SubmissionPublisher
, y eso es todo.
RxJava
Tiene
paquetes
completos de clases de tipo
Flow API
, es decir,
io.reactivex.subscribers
,
io.reactivex.processors
,
io.reactivex.observers
,
io.reactivex.observables
y
io.reactivex.observables
que parecen hacer algo similar.
¿Cuáles son las principales diferencias entre estas dos bibliotecas? ¿Por qué alguien usaría la biblioteca Java 9 Flow sobre la biblioteca RxJava mucho más diversa o viceversa?
¿Cuáles son las principales diferencias entre estas dos bibliotecas?
Esto se cumple principalmente como un comentario informativo (pero demasiado largo para encajar), el
JEP 266: Más actualizaciones de
simultaneidad responsables de la introducción de la API de
Flow
en Java9 lo afirma en su descripción (énfasis mío):
-
Interfaces que admiten el marco de publicación-suscripción de Reactive Streams , anidado dentro de la nueva clase Flow .
-
Publisher
producen artículos consumidos por uno o másSubscriber
, cada uno administrado por unaSubscription
. -
La comunicación se basa en una forma simple de control de flujo (método
Subscription.request
, para comunicar la contrapresión) que puede usarse para evitar problemas de gestión de recursos que de otro modo podrían ocurrir en sistemas basados en "empuje". Se proporciona una clase de utilidadSubmissionPublisher
que los desarrolladores pueden usar para crear componentes personalizados. -
Estas interfaces (muy pequeñas) corresponden a las definidas con amplia participación (de la iniciativa Reactive Streams) y admiten la interoperabilidad en varios sistemas asíncronos que se ejecutan en JVM.
-
Anidar las interfaces dentro de una clase es una política conservadora que permite su uso en varias posibilidades a corto y largo plazo . No hay planes para proporcionar componentes
java.util.concurrent
basados en red o E / S para mensajes distribuidos, pero es posible que las futuras versiones de JDK incluyan dichas API en otros paquetes .
¿Por qué alguien usaría la biblioteca Java 9 Flow sobre la biblioteca RxJava mucho más diversa o viceversa?
Mirando una perspectiva más amplia, esta es una opinión completamente basada en factores como el tipo de aplicación que un cliente está desarrollando y sus usos del marco.
"¿Cuáles son las principales diferencias entre estas dos bibliotecas?"
Como notó usted mismo, la biblioteca Java 9 es mucho más básica y básicamente sirve como una API general para secuencias reactivas en lugar de una solución completa.
"¿Por qué alguien usaría la biblioteca Java 9 Flow sobre la biblioteca RxJava mucho más diversa o viceversa?"
Bueno, por la misma razón, las personas usan construcciones básicas de bibliotecas sobre bibliotecas: una dependencia menos para administrar. Además, debido al hecho de que Flow API en Java 9 es más general, está menos restringido por la implementación específica.
Al principio, estaba Rx, versión uno. Era una especificación independiente del lenguaje de API reactivas que tiene implementaciones para Java, JavaScript, .NET. Luego lo mejoraron y vimos Rx 2 . Tiene implementaciones para diferentes idiomas también. En el momento de Rx 2, el equipo de Spring estaba trabajando en Reactor , su propio conjunto de API reactivas.
Y luego todos pensaron: ¿por qué no hacer un esfuerzo conjunto y crear una API para gobernarlos a todos? Así fue como se creó Rsc . Un esfuerzo conjunto de investigación para construir operadores que cumplan con los flujos reactivos altamente optimizados. Los implementadores actuales incluyen RxJava2 y Reactor.
Al mismo tiempo, los desarrolladores de JDK se dieron cuenta de que las cosas reactivas son geniales y vale la pena incluirlas en Java.
Como es habitual en el mundo de Java, el estándar de facto se convierte de jure.
¿Recuerdas Hibernate y JPA, Joda Time y Java 8 Date / Time API?
Entonces, lo que hicieron los desarrolladores de JDK fue extraer el núcleo de las API reactivas, la parte más básica, y convertirlo en un estándar.
Así nació
jucFlow
.
Técnicamente,
jucFlow
es mucho más simple, consta solo de
cuatro interfaces simples
, mientras que otras bibliotecas proporcionan docenas de clases y cientos de operadores.
Espero que esto responda a la pregunta "¿cuál es la diferencia entre ellos".
¿Por qué alguien elegiría
jucFlow
sobre Rx?
Bueno, porque ahora es un estándar!
Actualmente, JDK se entrega con una sola implementación de
jucFlow
:
HTTP / 2 API
.
En realidad es una API de incubación.
Pero en el futuro podríamos esperar el soporte de Reactor, RxJava 2 y de otras bibliotecas, como controladores de base de datos reactivos o incluso FS IO.