Reactive 시작하기

Ryan Donghyun Jin bio photo By Ryan Donghyun Jin

리액티브 프로그래밍

Reactive 흔히 Rx 프로그래밍이라고 합니다.

Reactive-Streams

Reactive Programming이라고 하면 “반응형 프로그래밍”이라고 해석할 수 있을 것입니다. Event Driven 방식으로 프로그래밍을 가능하게 해주는 프레임워크입니다.

Why?

  • Blocking is evil. Thread의 경우 CPU를 효육적으로 사용하기 위해서 Multi-thread이 가능합니다. 즉 여러 Thread를 생성하여 Thread마다 Task를 부여하여 동시에 작업을 진행하는 것입니다. Thread를 사용할 경우 성능에 영향을 미칠 수 있는 요인은 바로 Blocking 작업입니다. CPU의 경우 충분히 연산을 수행할 수 있음에도 CPU외의 DISK IO 등의 결과를 기다리기 위해서 Thread를 멈추는 것을 말합니다. 이러한 Blocking이 많으면 많을 수록 CPU 사용률이 떨어지고 전체적인 시스템 성능이 가장 느린 Operation에 따라 가게 됩니다.

  • Out of Callback hell. [/images/reactive_callback_hell.jpg] How?

    • Java Callbacks? ○ no Composition at all
    • Java Futures?

From - Netflix Opensource - .Net

Duality - [Java] Iterable - Iterator (pull) - [RxJava] Observable - Observer (push)

The Reacti - www.reactivemanifesto.org - www.reactive-streame.org

Show me! - Interface Observer ○ onNext(T data) ○ onCompleted() ○ onError(Throwable t) - Interface Obserbable ○ Compose & chain a stream ○ Subscribe an Observer

From Legacy code to reactiveX - Rest Controller(Observer) –> Observable

Observable Factories - just - from : using a collection - create

Functional Programming - Map ○ Input –(transform)–> Output - Revert back to Blocking ○ toBlocking ○ Choose what item to return • Transforming - flatMap ○ Make the data flat - Reduce ○ Running computation ○ Previous result come to next input - Filter ○ Filtering the input stream into output stream - Take ○ Subscribe the number of iterest - Take unitl ○ Subscribe the stream until condition - Count ○ Calculate the total number of stream • • Side Effect - doOnXXX (Logging 등…) ○ doOnNext ○ doOnError ○ doOnCompoleted ○ doOnEach - Combine ○ Concat : 2개의 Observable을 하나의 Stream으로 앞 뒤로 합침 ○ Merge : 실시간으로 합친다.(ex: flatMap) ○ Zip : 2개의 Observable과 Tramsformation Function을 이용하여 변경 • Recovering - Retry : 에러 발생시 다시 처음부터 읽어들임. • Obverable - Hot observable ○ 같은 데이터를 emit ○ Retry할 수 없음(같은 에러 발생) - Cold observable ○ Retry할 수 있음 • OnErrorReturn - 에러 발생시 대처 • Chaining - ZipWith ○ Called from stream a instead of statically ○ Combine both rates to get the final one - OnErrorResumeNext • Clean up controllers - Prepare a DefferedResult ○ That will be returned without blocking - Subscribe on stream ○ onNext : inject T via setTesult ○ onError: create a Specific Exception