2017-05-03 23 views
1

RxJava를보다 전통적인 이벤트 버스를 대체하는 새로운 경향에 대해 궁금해하기 때문에 반응 형 스트림에 대해 배우기 시작했습니다. 이것이 어떻게 수행되는지에 대한 일반적인 설명은 This blog post입니다. 내가 올바르게 이해한다면, RxJava 1.x는 엄격하게 Reactive Streams의 구현이 아니었지만 매우 유사했습니다. 버전 2.0에는 호환되거나 최소한 TCK를 통과하는 일부 클래스가 포함되어 있으므로이 코드의 업데이트 된 버전은 약간 다르게 보일 수 있습니다. 반응성 스트림 용어에서 Reactive Streams Processor를 이벤트 버스로 사용하는 것이 일반적입니까?

public class UserLocationModel { 

    private PublishSubject<LatLng> subject = PublishSubject.create(); 

    public void setLocation(LatLng latLng) { 
    subject.onNext(latLng); 
    } 

    public Observable<LatLng> getUserLocation() { 
    return subject; 
    } 
} 

, 나는 subject이 모두 PublisherSubscriberProcessor,라고 생각합니다.

문제는 아무것도에 가입되지 않은 SubscriberonNext를 호출하면 반응성 스트림 사양, 특히 rule 1.9을 위반하는 것처럼 보인다는 것이다.

이것은 구현의 세부 사항입니까? 일반적으로 호환되는 Reactive Streams 구현과 관련하여이 작업에 의존 할 수 없다는 점을 수정 했습니까?

답변

4

Subjects 및 Processors 표준 RxJava 2는 완화되어 있으므로 다른 방법을 호출하기 전에 onSubscribe을 호출 할 필요가 없습니다. 이것은 부분적으로 1.x 주제가 onSubscribe을 가지지 않았고, RxJava 2 프로세서가 Subscriber 쪽과 Publisher 쪽 사이의 요청을 조정하지 않아서 Subscription .

RxJava Processor을 RS 호환 Publisher에 등록하면 Long.MAX_VALUE을 요청하고 가능한 한 신호를 중계하는 것으로 보입니다. RS 호환 Subscriber을 RxJava Processor에 가입하면 그들은 Subscriber의 배압을 받아들이지 않고 요청이 넘치면 개별 MissingBackpressureException이 방출되고 Subscriber은 "던져"발생할 수 있습니다. 좌표 요청을 수행하는 extensions library에는 Publisher 사용자 지정이 있습니다.

일반적으로 호환 리액턴스 구현에서 작동하는 것은 신뢰할 수 없다고 생각합니다. 사양에 아무것도, 따라서 onSubscribe 전화를받지 않은 Processor으로 발생해야 어떤 TCK에서 테스트 아직 그것을 필요하지가 없습니다

따라서, 나는이 구현 세부 사항이되었다 생각합니다.

  1. 주제는 반응 세상과 명령형 세계를 해소하고 GUI 사례와 이벤트의 multicasters 비 backpressured 경우에 잘 작동하도록 고안되었다 :

    여기에 두 가지 큰 문제가 있습니다. 반응성 반응 형 멀티 캐스트에서는 publish(Function)과 같이 더 우수하고 직접적인 대안입니다.

  2. 이벤트 버스에서 생각하는 것은 한 발의 "레일"에서 이벤트를 배수하고 배수함으로써 단일 초크 포인트를 생성하기 때문에 뒤로 물러납니다. 대조적으로, 반응 형 디자인은 개별 스트림과 독립 스트림을 선호하는데, 각 스트림은 필요에 따라 스레드간에 점프 할 수 있으며 마지막 순간까지 주 스레드를 피할 수 있습니다.