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 정상 플로우#

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 메소드 없음
Last updated on