Reactive Programming


  • 데이터 흐름과 전달에 관한 프로그래밍 패러다임
  • 리액티브 스트림을 사용하는 프로그래밍
    • 리액티브 스트림
      • 잠재적으로 무한정 들어올 수 있는 비동기 데이터를 순서대로, 그리고 블록하지 않고 (non-blocking) 역압력(backpressure, 배압, 메세지를 받는 쪽에서 보내는 쪽으로 지속적으로 메세지를 처리할 수 있는지 알려 요청의 양을 조절하는 기술)으로 처리하는 표준 기술
    • 엽압력 (배압, Backpressure)
      • 발행 - 구독 프로토콜에서 이벤트 스트림(발행쪽)의 구독자가 발행된 이벤트를 처리하는 속도보다 느린 속도로 이벤트를 소비하면서 문제가 발생하지 않도록 보장하는 장치이다.
  • 왜 이런 패러다임이 생겼나?
    • 빅데이터/모바일부터 클라우드 기반 클러스터에 이르는 다양한 환경/밀리초 단위의 응답시간을 기대하는 유저의 사용패턴 요구사항을 만족시켜주기 위해
    • 기존에는 Thread Pool 을 활용해서 일처리를 진행했다. 이 때 I/O 작업이 많은 일을 하게 되는 Thread 의 경우 대부분 기다리는 상황이 벌어진다. 특히 Thread Pool 의 크기가 정해져 있다보니 성능의 한계가 찾아온다. 이를 해결하기 위해서 Thread Pool 대신 비동기 & non-blocking 모델을 사용해서 메시지 커뮤니케이션으로 전환하게 된다. 이 중에서 비동기 & non-blocking 모델에서 발생할 수 있는 문제를 backpressure 로 해결한 리액티브 스트림을 채택
  • Reactive 의 속성 4가지 Keyword
    • 반응성 : 일정하고 예상할 수 있는 빠른 반응시간
    • 회복성 : 장애가 전파되지 않고 복구된다.
    • 탄력성 : 작업량의 변화와 무관하다. 병목이 발생하면 관련 컴포넌트에 할당된 자원 수를 늘리면 그만이다.
    • 메시지기반 : 컴포넌트 간의 결합이 약하다. 시스템은 비동기 메세지 전달에 의존한다.
  • JDK 에서 리액티브 프로그래밍을 제공하는 기술
    • RxJava
      • 자바로 리액티브 프로그래밍을 할 수 있는 라이브러리
        • 비동기 프로그래밍과 함수형 프로그래밍 기법을 활용한다.
      • 복잡한 비동기 프로그램을 쉽게 개발할 수 있게 해준다.
    • Project Reactor
    • Spring Framework 5.0

 

 

java.util.concurrent.Flow 클래스


자바 9에서 리액티브 프로그래밍을 제공하기 위해서 Flow 클래스를 추가했다.

  • Akka, RxJava 등의 리액티브 라이브러리는 Flow 클래스에 정의된 인터페이스 표준을 따른다. 자세한 내용은 북마크를 참고해주세요.

 

 

참고

https://modimodi.tistory.com/m/47