개발자가 되고 싶은 사람

[RxJava2 #2] RxJava2 개략적 소개

|

RxJava2

  • RxJava1은 개발이 중단되었기 때문에 RxJava2를 사용한다.
  • reactive programming을 하기 위한 라이브러리인 Rx(reactive extensions)의 JVM판.
  • reactive streams는 java 8+에 친화적
  • 이벤트를 정의한 ‘Observable’ 인스턴스에 대해 짧은 함수를 엮은(체인) 스트림같이 이벤트 결과 데이터를 가공하는 처리를 정의, 지연실행, 비동기 콜백을 할 수 있다.
  • RxJava2.x에서는 Observable, Single, Maybe, Flowable로 클래스를 구분

RxJava1과 비교하여 달라진 RxJava2의 특징은?

1. 더이상 null을 보낼 수 없음(Observable 에서 null을 보내게 되면 바로 nullpointerException 처리 가능)

–> completable, maybe 활용 가능

2. Flowable의 추가.

  • flowable은 Backpressure를 지원하는 Observable이다.

3. Subscription의 Disposable로 변경됨.

  • reactive Streams 명세에서 source와 consumer의 상호작용을 나타내는데 subscription 이라는 이름을 사용했기 때문에, 충돌을 막기 위해 Disposable로 변경되었다.

4. Maybe가 추가됨.

  • Maybe클래스는 reduce()함수나 firstElement()함수와 같이 데이터가 발행 될 수 있거나 혹은 발행되지 않고도 완료되는 경우를 의미(값을 보낼 수도, 안 보낼 수도 있다)
  • 값이 있는 경우 onSuccess, 값이 없는 경우엔 onComplete가 호출된다.
  • 그리고 이런 리액트 프로그래밍을 하기 위해 스프링에서도 지원을 해주고 있다!

Observable

  • 옵저버블, 옵설버블 등으로 읽는다. RxJava뿐만 아니라 리액티브 프로그래밍의 기본적인 모델이다.
  • Observable = reactive stream.
  • 비동기 방식으로 전달되는 데이터 추상화.

Observer Design pattern

  • 일대다(one-to-many) 의존성을 정의한다.
  • 객체의 상태 변화를 관찰하는 관찰자들, 즉 옵저버들의 목록을 객체에 등록하여 상태 변화가 있을 때마다 메서드 등을 통해 객체가 직접 목록의 각 옵저버에게 통지하도록 하는 디자인 패턴이다. 주로 분산 이벤트 핸들링 시스템을 구현하는 데 사용된다. 발행/구독 모델로 알려져 있기도 하다.
  • 데이터 전달방식은 2가지가 있다.
  1. 주제객체에서 옵저버로 데이터를 보내는 방식(푸시 방식)
  2. 옵저버에서 주제객체의 데이터를 가져가는 방식 (풀 방식)

이미지

Flowable

  • 배압(Back pressure)를 해결 하기 위해 flowable(RxJava2부터 도입)을 했다.
  • Flowable은 Observable과 거의 비슷한데 다른 점이 back pressure이 지원된다는 점이다.
  • back pressure이란 데이터의 처리 순서를 보장해주는 로직이다.
  • Observable은 back pressure가 보장되지 않아 아이템이 순서대로 발행된다고 보장되지 않는다.
  • 하지만 Flowable은 보장된다. 따라서 Observable 보단 Flowable을 사용하는 걸 권장한다.

참고

  • backpressure? 이미지

  • Observable vs Flowable rxJava2 ? ==>
    Backpressure is when your observable (publisher) is creating more events than your subscriber can handle. So you can get subscribers missing events, or you can get a huge queue of events which just leads to out of memory eventually. Flowable takes backpressure into consideration. Observable does not. Thats it. it reminds me of a funnel which when it has too much liquid overflows. Flowable can help with not making that happen: with tremendous backpressure:

이미지

Reference

  1. http://reactivex.io/
  2. http://krksap.tistory.com/1189
  3. [RxJava2] 배압(Backpressure) 이란 무엇인가.
  4. webflux와 rxjava2-jdbc 설명
  5. Java 9의 새로운 기능 : 리 액티브 스트림
  6. https://dzone.com/articles/5-things-to-know-about-reactive-programming
  7. https://medium.com/@ggikko/rxjava-2-x-%EC%97%90-%EB%8C%80%ED%95%9C-%EC%83%9D%EA%B0%81-e11c7ca008d1
  8. flowable과 observable의 차이
  9. Reactive Thinking in Java with RxJava2(good)
  10. Observable vs Flowable rxJava2 ?

Comments