17. 리액티브 프로그래밍
주요내용
- 리액티브 프로그래밍 정의 및 매니페스토 확인
 - 애플리케이션 수준, 시스템 수준의 리액티브 프로그래밍
 - 리액티브 스트릠, Java 9 Flow API 사용한 예제코드
 - 널리 사용되는 RxJava 소개
 
리액티브 프로그래밍#
- 다양한 시스템과 소스에서 들어오는 데이터 항목 스트림을 비동기적으로 처리하고 합치는 것
 
왜 리액티브가 증가하고 있는가#
- 빅데이터, 다양한 환경, 사용 패턴 (밀리초 단위 응답시간 기대)
 
리액티브 매니페스토#
리액티브에 포함되어야 하는 공식 성명문
- 반응성 (responsive) : 예상 가능한 응답 시간
 - 회복성 (resilient) : 장애라도 시스템은 반응
 - 탄력성 (elastic) : 부하 시, 자동으로 관련된 컴포넌트의 자원을 늘림
 - 메시지 주도 (Message-driven) : 비동기 메시지를 전달해 컴포넌트끼리 통신
 
각 수준의 리액티브 프로그래밍#
애플리케이션 수준의 리액티브#
- 비동기로 작업을 수행
 - RxJava로 IO에 의한 메인 스레드 블록현상을 해결할 수 있음
- RxJava에서 별도의 스레드 풀을 제공, 메인 스레드와 영향 X
 
 
시스템 수준의 리액티브 (리액티브 시스템)#
- 애플리케이션을 조립하고 상호소통을 조절
 - 메시지 주도
 - 컴포넌트에서 발생한 장애를 고립 -> 다른 컴포넌트에 장애 전파를 방지 (회복성 제공)
- 회복성 -> fault tolerance (결함 허용) 제공
 - 회복성은 고립과 비결합이 중요
 
 - 탄력성은 투명성이 중요
- 위치 상관 없이 다른 모든 서비스 (컴포넌트) 와 통신할 수 있음
 
 
리액티브 스트림과 플로 API#
- 용어 설명
- 리액티브 프로그래밍: 리액티브 스트림을 사용하는 프로그래밍
 - 리액티브 스트림: 비동기 데이터를 순서대로, 블록하지 않는 역압력을 전제해 처리하는 표준 기술
 - 역압력: 발행-구독 프로토콜에서 이벤트 스트림의 구독자가 발행자의 이벤트 제공 속도보다 느린 속도로 이벤트를 소비
 
 - 역압력의 필요성
- 부하가 발생한 컴포넌트에 대해 이벤트 발행을 늦추라 말할 수 있음
 - 얼마나 많은 이벤트가 현재 수용 가능한지 알릴 수 있음
 - 기존데이터 처리가 얼마나 소요되는지 업스트림 발행자에게 알릴 수 있음
 
 
Flow API#
- 리액티브를 제공하는 
java.util.concurrent.Flowjava 9 내장 API - java 8 에서 리액티브 프로그래밍을 하고 싶으면 
RxJava,Akka등 외부 패키지를 사용 - 주요 인터페이스
- Publisher: 항목 발행
 - Subscriber: 항목 소비, 역압력 발생
 - Subscription: 발행-소비 제어 흐름 관리, 역압력 관리
 - Processor: Publisher, Subscriber 상속 인터페이스 (이벤트 변환단계를 의미)
- Publisher를 구독한 다음 수신한 데이터를 가공해 다시 제공하는 것
 
 
 
Flow API 정상 플로우#

왜 Java 9 Flow API 는 구현체가 없을까#
- Akka, RxJava 와 같은 리액티브 스트림의 자바 라이브러리가 이미 존재했음
 - Java 9 에서 Flow API 의 목적은 리액티브 개념 표준화를 통한 다양한 라이브러리 협력 증가
 
RxJava#
- 넷플릭스에서 Flow API 구현한 리액티브 스트림 라이브러리
 - RxJava의 데몬스레드에서 실행됨
- 메인 스레드가 죽으면 데몬스레드도 같이 죽기 때문에, 
blockingSubscribe와 같은 블럭 메소드를 활용하자 
 - 메인 스레드가 죽으면 데몬스레드도 같이 죽기 때문에, 
 - 두개의 Publisher 구현체
io.reactivex.Flowable: 역압력 지원io.reactivex.Observable: 기존 구현체- Subscriber 대신 
Observer - Subscription 대신 
Disposable: 역압력 지원 X -> request 메소드 없음 
- Subscriber 대신