특징 RxJava API와 Java 9 Flow API의 차이점




자바9 (4)

처음에는 Rx, 버전 1이있었습니다. 그것은 Java, JavaScript, .NET에 대한 구현이있는 반응적인 API의 언어에 구애받지 않는 사양이었습니다. 그런 다음 그들은 그것을 향상 시켰고 우리는 Rx 2를 보았습니다. 그것은 다른 언어에 대한 구현을 가지고 있습니다. Rx 2 당시 Spring 팀은 Reactor 연구 중이었습니다.

그리고 나서 그들은 모두 생각했습니다. 공동의 노력을 기울이지 않고 모든 것을 지배하기위한 하나의 API를 만드는 것이 어떻겠습니까? 그것은 Rsc 가 설립 된 방법이었습니다. 최적화 된 리액터 스트림 준수 운영자를위한 공동 연구 노력. 현재 구현자는 RxJava2와 Reactor를 포함합니다.

동시에 JDK 개발자들은 반응하는 내용이 훌륭하고 Java에 포함시킬 가치가 있다는 것을 깨달았습니다. 자바 세계에서는 평범하기 때문에 사실상의 표준이 정당화됩니다. Removber Hibernate와 JPA, Joda Time, Java 8 Date / Time API? 그래서 JDK 개발자들은 가장 기본적인 부분 인 반응성 API의 핵심을 추출하여이를 표준으로 삼습니다. 그것은 jucFlow 가 태어난 방법입니다.

기술적으로, jucFlow 는 훨씬 더 단순하며 4 개의 간단한 인터페이스 로만 구성되며 다른 라이브러리는 수십 개의 클래스와 수백 개의 연산자를 제공합니다.

나는 이것이 "그들 사이의 차이점"이라는 질문에 대답하기를 바랍니다.

누군가 Rx를 통해 jucFlow 를 선택하는 이유는 무엇입니까? 글쎄, 지금은 표준이기 때문에!

현재 JDK는 jucFlow : HTTP / 2 API를 하나만 구현하여 제공됩니다. 실제로는 잠복기 API입니다. 그러나 앞으로는 Reactor, RxJava 2뿐만 아니라 반응 형 DB 드라이버 나 FS IO와 같은 다른 라이브러리에서도이 기능을 지원할 것으로 예상됩니다.

마지막 몇 가지 주요 릴리스에서 Java를 반복 할 때마다 일관된 방식으로 동시 작업을 관리하는 새로운 방법이 있습니다.

Java 9에는 RxJava의 Flowable API 와 유사한 Flow API 가 있지만 Java 9에서는 훨씬 간단한 클래스 및 인터페이스 집합이 있습니다.

Java 9

Flow.Publisher , Flow.Subscriber , Flow.Processor , Flow.SubscriptionSubmissionPublisher 가 있고 그게 전부입니다.

RxJava

Flow API 와 유사한 클래스의 패키지 ( 예 : io.reactivex.flowables , io.reactivex.subscribers , io.reactivex.processors , io.reactivex.observersio.reactivex.observables 가 있습니다.

이 두 라이브러리의 주요 차이점은 무엇입니까? 왜 훨씬 더 다양한 RxJava 라이브러리에서 Java 9 Flow 라이브러리를 사용합니까?


"이 두 라이브러리의 주요 차이점은 무엇입니까?"

자바 9 라이브러리는 훨씬 기본적이고 기본적으로 본격적인 솔루션 대신 반응 형 스트림 용 일반 API로 사용됩니다.

"왜 다른 사람이 훨씬 더 다양한 RxJava 라이브러리에서 Java 9 Flow 라이브러리를 사용합니까? 아니면 그 반대입니까?"

음, 같은 이유로 사람들은 라이브러리에 대한 기본 라이브러리 구성을 사용합니다. 하나는 관리의 의존도가 낮습니다. 또한 Java 9의 Flow API가보다 일반화되어 있기 때문에 특정 구현에 대한 제약이 적습니다.


이 두 라이브러리의 주요 차이점은 무엇입니까?

Java 9 Flow API는 독립 실행 형 라이브러리가 아니라 Java Standard Edition 라이브러리의 구성 요소이며 2015 년 초에 설정된 Reactive Streams 사양에서 채택 된 4 개의 인터페이스로 구성되어 있습니다. 이론적으로 포함 시키면 다음과 같은 JDK 내 특정 용도를 활성화 할 수 있습니다. 인큐베이터 HttpClient, 계획된 비동기 데이터베이스 연결, 그리고 물론 SubmissionPublisher .

RxJava는 ReactiveX 스타일 API 디자인을 사용하여 리 액티브 (푸시) 데이터 흐름을 통해 다양한 연산자 집합을 제공하는 Java 라이브러리입니다. 버전 2는 Flowable 및 다양한 XxxProcessor 통해 Reactive Streams API를 구현합니다.이 API를 사용하면 Flowable 인스턴스를 다른 호환 라이브러리에서 사용할 수 있으며 차례로 임의의 PublisherFlowable 로 래핑하여이를 소비하고이를 사용하여 다양한 연산자 집합을 작성할 수 있습니다 .

따라서 Reactive Streams API는 최소한의 인터페이스 사양 이며 RxJava 2는이 API를 구현 입니다. RxJava는 자체적으로 풍부하고 유창한 API를 만들기위한 대규모 추가 메소드를 선언합니다.

RxJava 1은 다른 소스 중에서도 Reactive Streams 사양에 영감을 불어 넣었으나이를 사용할 수는 없었습니다 (호환성을 유지해야했습니다). RxJava 2는 완전히 재 작성되고 별도의 주 버전이되어 Reactive Streams 사양을 채택하고 사용할 수 있으며 ( Rsc 프로젝트 덕분에 내부적으로 확장 될 수도 있음) Java 9 이전에 거의 릴리스되었습니다. v1과 v2가 Java 6을 계속 지원하므로 안드로이드 런타임이 많이 지원됩니다. 따라서 Java 9에서 직접 제공되는 Flow API에서 직접 대문자로 사용할 수는 없지만 bridge 통해서만 사용할 수 있습니다. 이러한 브릿지는 다른 리 액티브 스트림 기반 라이브러리에 의해 요구되거나 제공됩니다.

RxJava 3는 Java 9 Flow API를 대상으로 할 수 있지만 아직 결정되지 않았으며 후속 Java 버전의 기능 (예 : 값 유형)에 따라 1 년 내에 v3이 없을 수도 있습니다.

그때까지는 Flow API를 구현하고 ReactiveX 스타일의 풍부한 유창한 API를 제공하는 Reactive4JavaFlow라는 프로토 타입 라이브러리가 있습니다.

왜 훨씬 더 다양한 RxJava 라이브러리에서 Java 9 Flow 라이브러리를 사용합니까?

Flow API는 상호 운용 사양이며 최종 사용자 API는 아닙니다. 일반적으로, 직접 사용하지 않고 플로우를 다양한 구현에 전달합니다. JEP 266에 대해 논의했을 때, 저자는 기존 API의 흐름 API (rich java.util.Stream 과는 달리)가 기본이되는 API를 찾지 못했습니다. 따라서 사용자는 현재 제 3 자 구현에 의존해야 할 것입니다.

기존의 리액턴스 라이브러리가 자체적 인 브리지 구현 또는 새 라이브러리 구현을 통해 Flow API를 기본적으로 지원할 때까지 기다려야합니다.

Flow API에 대해 풍부한 연산자 세트를 제공하면 라이브러리가이를 구현할 수 밖에 없습니다. 데이터 소스 벤더 (반응 형 데이터베이스 드라이버, 네트워크 라이브러리)는 Flow API를 통해 자체 데이터 접근자를 구현하기 시작할 수 있으며 모든 라이브러리가 이러한 모든 연산자를 구현하지 않고도이를 감싸고 변환 및 조정할 수 있습니다. .

따라서 더 나은 질문은 이제 Flow API 기반 상호 운용을 사용하거나 Reactive Streams를 사용해야한다는 것입니다.

비교적 빨리 작업하고 신뢰할 수있는 솔루션이 필요한 경우 지금은 리 액티브 스트림 생태계를 고수하는 것이 좋습니다. 충분한 시간이 있거나 물건을 탐색하고 싶다면 Flow API를 사용할 수 있습니다.


이 두 라이브러리의 주요 차이점은 무엇입니까?

JEP 266 : Java API에서 Flow API를 소개하는 Concurrency Updates (자세한 동시성 업데이트) 에서는 설명 (강조 항목)에서이를 설명합니다.

  • Reactive Streams publish-subscribe 프레임 워크를 지원하는 인터페이스는 새로운 클래스 Flow 내에 중첩됩니다.

  • PublisherSubscription 관리하는 하나 이상의 Subscriber 소비하는 항목을 생성합니다.

  • 통신은 "밀어 ​​넣기"기반 시스템에서 발생할 수있는 자원 관리 문제를 피하기 위해 사용할 수있는 간단한 형태의 흐름 제어 (배압을 전달하기위한 Subscription.request 메소드)에 의존합니다. 개발자가 사용자 지정 구성 요소를 만드는 데 사용할 수있는 유틸리티 클래스 SubmissionPublisher 가 제공됩니다.

  • 이 (매우 작은) 인터페이스는 Reactive Streams 이니셔티브의 광범위한 참여로 정의 된 인터페이스에 해당하며 JVM에서 실행되는 여러 비동기 시스템에 대한 상호 운용성을 지원합니다.

  • 클래스 내의 인터페이스를 중첩하는 것은 여러 가지 단기 및 장기적 가능성을 뛰어 넘어서 사용할 수 있는 보수적 인 정책 입니다. 분산 메시징을 위해 네트워크 또는 I / O 기반의 java.util.concurrent 구성 요소를 제공 할 계획은 없지만 향후 JDK 릴리스에는 다른 API에 이러한 API가 포함될 가능성이 있습니다 .

왜 훨씬 더 다양한 RxJava 라이브러리에서 Java 9 Flow 라이브러리를 사용합니까?

광범위한 전망을 살펴보면 클라이언트가 개발중인 응용 프로그램 유형 및 프레임 워크의 용도와 같은 요소를 기반으로 한 완전히 의견입니다.





java-9