본문 바로가기

빗썸 테크코스 아카데미/1주차(Event Driven)

2일 리액티브 프로그래밍

리액티브 프로그래밍이란?

요구사항의 변화

한 개의 거대한 앱에서 도메인별로 나뉘어진 여러개의 Micro App으로 변화함에 따라 응답이 잘되고, 탄력적이며 유연하고 메시지 기반으로 동작하는 시스템의 필요성이 대두되었고 이에 따라 등장한 프로그래밍 방식이다.

리액티브 프로그래밍은 데이터 스트림과 변경 사항 전파를 중심으로하는 비동기 프로그래밍 패러다임이다. 이것은 프로그래밍 언어로 정적 또는 동적인 데이터 흐름을 쉽게 표현할 수 있어야하며, 데이터 흐름을 통해 하부 실행 모델이 자동으로 변화를 전파할 수 있는 것을 의미한다.

리액티브 프로그래밍은 위의 그림처럼 비동기 & 논블록킹 방식을 취하고 있다.

funB가 funcA를 호출하며 callbackUrl을 주고 funA는 callBackUrl을 통해 실행 후 callBack Func을 호출한다. 다수의 쓰레드를 사용 가능한 이유가 여기에 있다.

또한 리액티브 프로그래밍에서 리액티브 선언이 존재하고, 리액티브 선언이 정의하는 네가지 원칙의 요지는 아래와 같다.

 

리액티브 선언이 정의하는 네가지 원칙

Responsive (응답성)

시스템은 즉각 응답해야 합니다. 응답성 있는 시스템은 신속하고 일관성 있는 응답 시간을 유지해 일관된 서비스 품질을 제공합니다.

Resilient (탄력성)

시스템에 장애가 발생하더라도 응답성을 유지해야 합니다. 탄력성은 복제(replication), 봉쇄(containment), 격리(isolation), 위임(delegation)에 의해서 이루어집니다.

장애는 각 컴포넌트 내부로 억제돼 각 컴포넌트들을 서로 격리시키는데, 그래서 하나의 컴포넌트에 장애가 발생하더라도 전체 시스템에 영향을 끼치지 못하게 됩니다.

Elastic (유연성)

리액티브 시스템은 작업량이 변하더라도 그 변화에 대응하고 응답성을 유지해야 합니다. 리액티브 시스템은 상용 하드웨어 및 소프트웨어 플랫폼에서 효율적인 비용으로 유연성을 확보합니다.

Message driven (메시지 기반)

탄력성의 원칙을 지키려면 리액티브 시스템은 비동기적인 메시지 전달에 의전해 컴포넌트들 간의 경계를 형성해야 합니다.

 

리액티브 스트림

리액티브 프로그래밍을 위한 interface

Nonblocking backpressure을 이용한 비동기 스티림 처리의 표준이다.

여기서 backpressure는 데이터를 소비하는 컨슈머가 처리할 수 있는 만큼만 전달 데이터를 제한하여 지나치게 빠른 데이터 소스로부터 데이터 전달 폭주를 방지한다.

 

리액티브 스트림의 인터페이스는 다음과 같은 4가지로 구성된다.

  • Publisher 발행자
  • Subscriber 구독자
  • Subscription 구독
  • Processor 프로세서

Publisher

publisher는 하나의 Subscription 당 하나의 Subscriber에 전송하는 데이터를 생성한다.

퍼블리셔(발행자)

Subscriber

Subscriber가 구독 신청되면 Publisher 로부터 이벤트를 수신할 수 있다.

구독자

Subscription

Subscriber 는 Subscription 객체를 통해서 구독을 관리할 수 있다.

Processor

Processor 인터페이스는 Subscriber와 Publisher 를 결합한 것이다.

Marble Diagram

마블 다이어그램은 'Observable과 Observable의 전환을 어떻게 표현하는지 보여준다'라고 설명하고 있다.

이는 풀이하자면, Observable에 어떠한 연산자(Operators)를 적용했을 때 생기는 변화를 도표로 표한한것이라고 볼수 있다.

리액터

리액터란 리액티브 스트림을 구현하는 라이브러리이며, Mono, Flux, Schedulers, Erros, Processors를 핵심 특징으로 가지고 있다.

Mono And Flux

  • org.reactivestreams.Publisher의 구현체
  • 시퀀스를 제공하는 발행자 역할
  • Mono : 0-1 개의 데이터 전달
  • Flux : 0-N개의 데이터 전달