Reactive Programming

2020.05.09

@godori at sat10am

하이하이

Subtitle

계기

2017년쯤에 유행했던 거 아님?

WebFlux

...회사에서 하게 됐습니다

내가 하던 것

@RestController
public class MyController {
	@GetMapping("/hello/{name}")                 
	String hello(@PathVariable String name){     
		return "Hello " + name;                                
	}
}

회사 코드를 본 나

그래서 WebFlux 공부

Special Thanks to..

팀원: 저희 코드는 Reactor를 중심으로 보시면 됩니다

Reactor란?

JVM기반의 non-blocking(논 블록킹) 어플리케이션을 만들기 위해 Project Reactor에서 만든 라이브러리

Reactive Streams의 구현체이다.

Reactive Streams?

파고파고 들어가다보니 Reactive Programming

Terminology

  • 함수형 프로그래밍(Functional Programming)
  • 리액티브 프로그래밍(Reactive Programming)
  • 함수형 리액티브 프로그래밍(Functional Reactive Programming - FRP)
  • Actor
  • ReactiveX
  • Reactive Streams
  • Reactor
  • ....

🤯

유사하게 헷갈리는 개념이 너무 많음

함수형 프로그래밍(FP)

리액티브 프로그래밍(RP)

데이터 흐름과 변화 전파에 중점을 둔 프로그래밍 패러다임
 

자료 처리를 수학적 함수의 계산으로 취급하고 상태와 가변 데이터를 멀리하는 프로그래밍 패러다임

함수형 리액티브 프로그래밍(FRP)

맵(map), 리듀스(reduce), 필터(filter)와 같은 함수형 빌딩블록을 이용해서 스트림을 처리하는 프로그래밍 방법론

 1997년에 처음 도입된 이래 자기만의 고유한 역사를 가지고 있는 별도의 개념

Actor Model

The actor model is a mathematical model of concurrent computation that treats actor as the universal primitive of concurrent computation.

Actor Model

The actor model is a mathematical model of concurrent computation that treats actor as the universal primitive of concurrent computation.

프로그래머가 직접 쓰레드(Thread)라는 구체적인 객체를 만들어서 관리하는 것이 아니라 업무(Task)라는 추상적인 작업단위를 만들어서 시스템에 제출하도록 만드는 것

ReactiveX

ReactiveX is a library for composing asynchronous and event-based programs by using observable sequences.

RX는 현대 프로그래밍 모델을 비동기적이고, 이벤트 중심인 데이터 구조, 즉 Observable을 통해서 재정의하려는 노력

Iterable ⇒ 컨슈머가 프로듀서로부터 값을 풀링하고 스레드는 값이 도착하기 전까지 블록 됨

Observable ⇒ 프로듀서가 값을 컨슈머에게 푸시하고 컨슈머는 언제나 가용 상태

 

따라서 이러한 접근 방법은 값을 동기적은 물론 비동기적으로도 받을 수 있으므로 더 유연하다

Reactive Programming of RX

Reactive Streams

구현체로는 RxJava, Reactor, Vert.x, Akka, Slick 등

Reactive Streams is an initiative to provide a standard for asynchronous stream processing with non-blocking back pressure.

즉 JVM 위에서 구현되는 리액티브 스트림 라이브러리에 표준을 정의하려는 것

JVM기반의 non-blocking(논 블록킹) 어플리케이션을 만들기 위해 Project Reactor에서 만든 라이브러리 Reactive Streams의 구현체

Reactor

블로킹과 논 블로킹

호출 된 함수가 바로 결과를 리턴하느냐 마느냐에 따라 구분

바로 리턴하게 되면 논 블로킹

즉, 논 블로킹이란 기다리지 않고 곧장 함수를 실행한다는 의미

동기와 비동기

동시에 발생한다는 것은 현재 작업의 응답이 발생하면 동시에 다음 작업을 수행하는 것

즉, 동기란 작업들이 순차적인 흐름을 가지고 있다는 것

비동기는 반대로 현재 작업의 응답과 다음 작업 요청의 타이밍이 일치하지 않아도 되는 것

동기/비동기 vs 블록킹/논블록킹
동기와 비동기는 프로세스의 수행 순서 보장에 대한 매커니즘 블록킹과 논 블록킹은 프로세스의 유휴 상태에 대한 개념

Reactive

Reactive

" In computing, reactive programming is a declarative programming paradigm concerned with data streams and the propagation of change."

from wikipedia

사용자가 해당 소프트웨어를 사용하기 위해서 어떤 입력을 발생 시켰을 때 꾸물거리지 않고 최대한 빠른 시간 내에 응답을 한다는 의미

리액티브 프로그래밍은 데이터가 변경되는 흐름에 따라 자동으로 전파되는 프로그래밍 방식으로,

주로 GUI 입출력, 시간 경과에 따라 상태가 변화하는 처리, 비동기 통신을 하는 애플리케이션에 사용하기 적합

리액티브라는 용어의 의미를 정의하려고 노력하는 리액티브 선언

Reactive manifesto

리액티브의 4가지 속성

 응답성(responsive)

 유연성(resilient)

신축성(elastic)

메시지 주도(message driven)

응답성(responsive)

'꾸물거리지 않고 응답한다'는 뜻으로

4가지 속성 중에서 가장 상위에 놓이는 궁극적 목적

 

 

유연성(resilient)

흔히 말하는 장애허용(fault tolerance)의 다른 말

 

장애를 허용한다는 것은 부분적인 장애나 고장이 시스템 전체를 망가뜨리지 않음을 뜻한다.

 

즉, 유연성은 고장을 예외가 아니라 기능으로 받아들인다

 신축성(elastic)

확장/축소 가능성

AWS에서 트래픽이 늘어나면 서버의 수가 자동으로 늘어나고 트래픽이 줄어들면 서버의 수가 자동으로 줄어드는 개념과 유사

메시지 주도(message driven)

소프트웨어를 구성하는 조각과 조각이 의사소통을 하는 방식이 메시지를 주고받는 방식으로 이루어진다는 의미

조각은 컴포넌트, 서비스, 객체, API, 무엇이라도 될 수 있다. 

Why Reactive?

  • 수십 대의 서버 → 수백, 수천 대의 서버
  • 수십, 수백 개의 코어 →수천, 수만 개의 코어
  • 초(second) 단위 반응 속도 → 밀리초(millisecond) 단위 반응 속도
  • 연간 몇 시간의 다운 시간 → 0 다운 시간
  • 기가바이트 데이터 →페타바이트 데이터
  • 소프트웨어 설계의 복잡성 – 동시성, 장애처리, 확장성

컴퓨팅 환경의 변화

어쨌거나 최종 목적은

응답을 빠르게 하기 위한 것

리액티브 프로그래밍이 약속하는 것은 개발자들이 보다 적은 작업으로 많은 일을 할 수 있도록 해 주는 것이고, 적은 수의 스레드로 더 많은 부하를 처리할 수 있도록 하는 것

결론:

Thank you!

Made with Slides.com