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