IT/Spring WebFlux 9

Customizing Requests

Overview downstream(Subscriber)에서 upstream(Publisher)으로 구독을 하고나면, Subscriber는 Subscription을 통해 Publisher로 데이터를 요청하게 됩니다. 종종 이 요청을 커스터마이징할 필요가 있는데, 가장 쉬운 방법으로는 BaseSubscriber를 이용하는 방법이 있습니다. Reactor에서 배압(backpressure)처리는 request를 upstream으로 요청하는 것과 같습니다. 배압을 사용하지 않는 방식의 연산자들을 추가적으로 살펴보고 마지막으로 인입된 요청을 변경 시킬 수 있는 연산자들을 살펴보겠습니다. BaseSubscriber BaseSubscriber는 추상클래스로 보통 이를 확장한 하위 Subscriber를 구현하여 사용합..

IT/Spring WebFlux 2020.12.29

Create, Subscribe, Disposable

Create Flux와 Mono를 시작하는 가장 쉬운 방법은 각 클래스들에 있는 무수히 많은 factory 메서드 중 하나를 사용하는 것 입니다. 예를 들어, 문자열의 sequence를 하나 만들고 싶다면, just로 직접 생성하거나 컬렉션으로 묶고 fromIterable로 만들 수 있습니다. Flux seq1 = Flux.just("foo", "bar", "foobar"); List iterable = Arrays.asList("foo", "bar", "foobar"); Flux seq2 = Flux.fromIterable(iterable); Mono noData = Mono.empty(); Flux numbersFromFiveToSeven = Flux.range(5, 3); Subscribe 구독하기..

IT/Spring WebFlux 2020.12.21

Reactor Core - Mono & Flux

Overview 리액터 프로젝트의 메인 아티팩트는 바로 Reactor-Core(리액터 코어)입니다. 리액터코어는 리액티브 스트림 스펙에 집중한 리액티브 라이브러리이면서 Java 8을 타깃으로 하고 있습니다. 리액터는 컴포저블한 리액티브 타입으로 Publisher를 구현하였고 풍부한 연산자들을 제공합니다. 그리고 그것이 바로 Mono & Flux입니다. Flux는 0 ~ N개의 아이템의 리액티브 sequence를 나타내며, 반면 Mono는 단일 아이템을 가지거나 가지지 않는 결과(0 ~ 1개)를 나타냅니다. Mono와 Flux간의 이러한 구별은 비동기 절차의 대략적인 카디널리티를 나타내는 약간의 의미(semantic) 정보를 일종의 유형(type)으로 전달합니다. 예를 들어, 한 HTTP 요청이 오직 단 ..

IT/Spring WebFlux 2020.12.14

Project Reactor

Overview Project Reactor란 리엑티브 프로그래밍을 구현한 라이브러리입니다. Reactor는 Reactive Streams를 기반으로 JVM에서 리액티브 프로그래밍을 가능하게 합니다. 스프링 5에서 추가된 Spring Webflux는 내부적으로 Project Reactor를 reactive library로 사용합니다. Reactor는 Reactive Streams의 구현체이기 때문에 자연스럽게 Non-Blocking, Back Pressure을 지원합니다. The Assembly Line Analogy 리액티브 애플리케이션으로 처리되는 데이터는 마치 공정 라인을 따라 이동하는것 처럼 보입니다. 리액터는 컨베이너 벨트이자 워크 스태이션입니다. 원료가 되는 가공되지 않은 물질들이 들어오고 막..

IT/Spring WebFlux 2020.12.13

Event-Driven & WebFlux

Event-Driven Programming Event-Driven Programming은 기존의 절차적 실행흐름이 아니라 이벤트에 의해 실행흐름이 정해지는 프로그래밍 방법입니다. GUI(Graphical User Interface)가 발전하면서 Event-Driven 방식도 발전해왔습니다. Event-Driven Architecture 위 그림은 Event-Driven Programming 방식을 지원하는 Event-Driven Architecture의 간단한 모식도입니다. 주요 컴포넌트와 그 역할은 아래와 같습니다. Event Loop Event를 적재하거나 Event의 상태를 관찰합니다. Event의 상태 또는 특정 조건에 따라 Event Handler에게 Event 처리 작업을 위임합니다. 상황에..

IT/Spring WebFlux 2020.11.10

Back Pressure

Overview 배압(Back Pressure)은 시스템의 한 구성요소가 감당할 수 있는 만큼의 작업량을 할당하여 전체 시스템을 안정적으로 유지하는 기법을 말합니다. Back Pressure는 사실 옵져버 패턴(Observer Pattern)의 데이터를 처리하는 방식과 유사합니다. 크게 Push 방식과 Pull 방식이 중 배압은 바로 Pull 방식의 데이터 처리 기법입니다. Push Push 방식은 Publisher가 Subscriber에게 이벤트를 밀어 넣는 방식입니다. 그런데 Publisher는 Subscriber의 상태를 고려하지 않고 이벤트를 전달하는 데에만 충실합니다. 만약 Subscriber가 이벤트를 빠르게 처리하지 못하면, 처리되지 못한 이벤트는 큐(Queue) 메모리 버퍼에 쌓이게 됩니다..

IT/Spring WebFlux 2020.11.07

Non-Blocking

Overview Spring Webflux를 적용한 애플리케이션은 비동기 논블러킹(Asynchronous Non-Blocking) 하다고 합니다. 과연 논블러킹하다는 말은 어떤 의미일까요? 논블러킹을 이해하기에 앞서 Blocking I/O, Synchronous Non-Blocking I/O를 순차적으로 보고 최종적으로 논블로킹(Asynchronous Non-Blocking I/O)을 알아보겠습니다. Blocking I/O Blocking I/O 모델에서 애플리케이션은 커널에 I/O 요청을 보내고 응답이 오기 전까지는 Block 상태가 되어 다른 작업을 수행할 수 없습니다. 일반적인 Spring MVC(서블릿 기반)와 RDBMS를 사용하고 있으면 대부분 이 Blocking I/O 모델을 따릅니다. 대부분..

IT/Spring WebFlux 2020.11.07
반응형