RxJava API와 Java 9 Flow API의 차이점
지난 몇 가지 주요 릴리스에 대한 Java의 모든 반복에서 동시 작업을 관리하는 새로운 방법이 지속적으로 제공됩니다.
Java 9 에는 RxJava 의 Flowable API 와 유사한 Flow API 가 있지만 Java 9에는 훨씬 더 간단한 클래스 및 인터페이스 세트가 있습니다.
자바 9
가지고 Flow.Publisher
, Flow.Subscriber
, Flow.Processor
, Flow.Subscription
, 그리고 SubmissionPublisher
그것에 대해, 그리고 그의를.
RxJava
전체 가지고 패키지 의 흐름 API 클래스 -like을, 즉 io.reactivex.flowables
, io.reactivex.subscribers
, io.reactivex.processors
, io.reactivex.observers
,와 io.reactivex.observables
비슷한 할 것 같다있다.
이 두 라이브러리의 주요 차이점은 무엇입니까? 누군가가 훨씬 더 다양한 RxJava 라이브러리를 통해 Java 9 Flow 라이브러리를 사용하거나 그 반대로 사용하는 이유는 무엇입니까?
이 두 라이브러리의 주요 차이점은 무엇입니까?
Java 9 Flow API는 독립 실행 형 라이브러리가 아니라 Java Standard Edition 라이브러리의 구성 요소이며 2015 년 초에 제정 된 Reactive Streams 사양 에서 채택 된 4 개의 인터페이스로 구성됩니다 . 이론적 으로이 API를 포함하면 다음과 같은 JDK 내 특정 용도를 사용할 수 있습니다. 인큐베이팅 HttpClient, 계획된 비동기 데이터베이스 연결, 그리고 물론 SubmissionPublisher
.
RxJava는 ReactiveX 스타일 API 디자인을 사용하여 반응 (푸시) 데이터 흐름에 대한 풍부한 연산자 집합을 제공하는 Java 라이브러리입니다. 를 통해 버전 2, Flowable
다양한 XxxProcessor
S, 구현의 인스턴스 수있는 반응성 스트림 API Flowable
호환되는 다른 라이브러리에 의해 소비 될 차례로 하나가 어떤 포장 할 수 Publisher
로를 Flowable
들을 소비하고 그들과 함께 사업자의 풍부한 세트를 구성 할 수 있습니다.
따라서 Reactive Streams API는 최소한의 인터페이스 사양 이고 RxJava 2는이를 구현 한 것 중 하나이며 RxJava는 자체적으로 풍부하고 유창한 API를 형성하기 위해 대규모 추가 메소드 세트를 선언합니다.
RxJava 1은 다른 소스 중에서 Reactive Streams 사양에 영감을 주었지만이를 활용할 수 없었습니다 (호환성을 유지해야 함). RxJava 2는 전체 재 작성 및 별도의 메인 버전으로 Reactive Streams 사양을 수용하고 사용할 수 있으며 ( Rsc 프로젝트 덕분에 내부적으로 확장 할 수도 있음 ) Java 9보다 거의 1 년 전에 출시되었습니다. v1과 v2 모두 Java 6을 계속 지원하므로 많은 Android 런타임을 지원하기로 결정되었습니다. 따라서 현재 Java 9에서 제공하는 Flow API를 직접 활용할 수는 없지만 브리지를 통해서만 사용할 수 있습니다. 이러한 브리지는 다른 Reactive Streams 기반 라이브러리에서도 필요하거나 제공됩니다.
RxJava 3는 Java 9 Flow API를 대상으로 할 수 있지만 아직 결정되지 않았으며 후속 Java 버전이 제공하는 기능 (즉, 값 유형)에 따라 1 년 정도 내에 v3가 제공되지 않을 수 있습니다.
그때까지,라는 프로토 타입 라이브러리가 Reactive4JavaFlow 흐름 API와 이벤트 그 위에 ReactiveX 스타일의 풍부한 유창하게 API를 구현한다.
누군가가 훨씬 더 다양한 RxJava 라이브러리를 통해 Java 9 Flow 라이브러리를 사용하거나 그 반대로 사용하는 이유는 무엇입니까?
Flow API는 최종 사용자 API가 아니라 상호 운용 사양입니다. 일반적으로 직접 사용하지 않고 다양한 구현에 흐름을 전달합니다. JEP 266이 논의되었을 때 저자는 기존 라이브러리의 API가 Flow API에 기본값을 갖기에 충분하다는 것을 찾지 못했습니다 (풍부한 것과는 달리 java.util.Stream
). 따라서 사용자는 당분간 타사 구현에 의존해야하기로 결정되었습니다.
자체 브리지 구현 또는 구현할 새 라이브러리를 통해 기존 반응 라이브러리가 기본적으로 Flow API를 지원할 때까지 기다려야합니다.
Flow API를 통해 풍부한 연산자 집합을 제공하는 것은 라이브러리가이를 구현하는 유일한 이유입니다. 데이터 소스 공급 업체 (예 : 반응 적 데이터베이스 드라이버, 네트워크 라이브러리)는 Flow API를 통해 자체 데이터 접근자를 구현하기 시작할 수 있으며 풍부한 라이브러리에 의존하여 모든 사람이 이러한 모든 종류의 연산자를 구현하도록 강요하지 않고도이를 래핑하고 변환 및 조정을 제공 할 수 있습니다. .
결과적으로 더 나은 질문은 Flow API 기반 상호 운용을 지금 시작해야합니까, 아니면 Reactive Streams를 고수해야합니까?
비교적 빨리 작동하고 신뢰할 수있는 솔루션이 필요하다면 당분간 Reactive Streams 생태계를 고수하는 것이 좋습니다. 시간이 충분하거나 탐색하고 싶다면 Flow API 사용을 시작할 수 있습니다.
처음에는 Rx, 버전 1이있었습니다. Java, JavaScript, .NET에 대한 구현이있는 반응 형 API의 언어에 구애받지 않는 사양이었습니다. 그런 다음 그들은 그것을 개선했고 우리는 Rx 2를 보았습니다 . 다른 언어에 대한 구현도 있습니다. Rx 2 당시 Spring 팀은 Reactor ( 자신의 반응 형 API 세트)를 작업하고있었습니다 .
그리고 그들은 모두 생각했습니다. 공동으로 노력하고 하나의 API를 만들어 모두를 지배하는 것은 어떨까요? 그것이 Reactive Commons 가 설정된 방법 입니다. 고도로 최적화 된 반응 스트림 준수 연산자를 구축하기위한 공동 연구 노력. 현재 구현에는 RxJava2 및 Reactor가 포함됩니다.
동시에 JDK 개발자는 반응 형 콘텐츠가 훌륭하고 Java에 포함 할 가치가 있음을 깨달았습니다. 자바 세계에서 흔히 볼 수 있듯이 사실상의 표준은 법적인 기준이됩니다. Remeber Hibernate 및 JPA, Joda Time 및 Java 8 Date / Time API? 그래서 JDK 개발자가 한 일은 가장 기본적인 부분 인 반응 형 API의 핵심을 추출하여 표준으로 만드는 것입니다. 그것이 j.u.c.Flow
태어난 방법 입니다.
기술적 j.u.c.Flow
으로 훨씬 더 간단하며 4 개의 간단한 인터페이스 로만 구성되는 반면 다른 라이브러리는 수십 개의 클래스와 수백 개의 연산자를 제공합니다.
나는 이것이 "그들 사이의 차이점은 무엇입니까"라는 질문에 대답하기를 바랍니다.
누군가 j.u.c.Flow
Rx보다 선택 하는 이유는 무엇 입니까? 글쎄, 지금은 표준이기 때문에!
단 하나의 구현 현재 JDK 선박 j.u.c.Flow
: HTTP / 2 API . 실제로 인큐베이팅 API입니다. 그러나 미래에는 Reactor, RxJava 2 및 반응 DB 드라이버 또는 FS IO와 같은 다른 라이브러리에서 지원을 기대할 수 있습니다.
"이 두 라이브러리의 주요 차이점은 무엇입니까?"
직접 언급했듯이 Java 9 라이브러리는 훨씬 더 기본적이며 기본적으로 본격적인 솔루션 대신 반응 스트림에 대한 일반 API 역할을합니다.
"누군가가 훨씬 더 다양한 RxJava 라이브러리를 통해 Java 9 Flow 라이브러리를 사용하거나 그 반대로 사용하는 이유는 무엇입니까?"
음, 같은 이유로 사람들은 라이브러리보다 기본적인 라이브러리 구조를 사용합니다. 또한 Java 9의 Flow API가 더 일반적이라는 사실로 인해 특정 구현의 제약을 덜받습니다.
이 두 라이브러리의 주요 차이점은 무엇입니까?
이것은 대부분 유익한 주석 (하지만 너무 길어 적합하지 않음)으로 적용됩니다. JEP 266 :Flow
Java9 에서 API 도입을 담당하는 동시성 업데이트 추가 는 설명 (강조 내)에서이를 설명합니다.
-
Reactive Streams 게시-구독 프레임 워크를 지원하는 인터페이스 , 새 클래스 Flow 내에 중첩됩니다 .
-
Publisher
는 하나 이상의에서 소비하는 항목을 생성Subscriber
하며 각각Subscription
. -
Communication relies on a simple form of flow control (method
Subscription.request
, for communicating back pressure) that can be used to avoid resource management problems that may otherwise occur in "push" based systems. A utility classSubmissionPublisher
is provided that developers can use to create custom components. -
These (very small) interfaces correspond to those defined with broad participation (from the Reactive Streams initiative) and support interoperability across a number of async systems running on JVMs.
-
Nesting the interfaces within a class is a conservative policy allowing their use across various short-term and long-term possibilities. There are no plans to provide network- or I/O-based
java.util.concurrent
components for distributed messaging, but it is possible that future JDK releases will include such APIs in other packages.
Why would someone use the Java 9 Flow library over the much more diverse RxJava library or vice versa?
Looking at a wider prospect this is completely opinion based on factors like the type of application a client is developing and its usages of the framework.
참고URL : https://stackoverflow.com/questions/47354837/difference-between-rxjava-api-and-the-java-9-flow-api
'IT Share you' 카테고리의 다른 글
실제 h1 대신 .h1을 사용하는 이유는 무엇입니까? (0) | 2020.12.04 |
---|---|
Visual Studio Code 휴지통에서 삭제 된 파일 복원 (0) | 2020.12.04 |
신속하게 새 라인을 만드는 방법 (0) | 2020.12.03 |
출력을 / dev / null로 리디렉션하더라도 printf에 여전히 비용이 발생합니까? (0) | 2020.12.03 |
int를 String으로 변환하는 가장 효율적인 방법은 무엇입니까? (0) | 2020.12.03 |