Reactor
- 리액티브 스트림즈 표준 사양을 구현한 구현체 중 하나
- Spring 5 버전부터 지원하는 리액티브 스택에 포함
- 리액티브 애플리케이션 동작에 있어 핵심적 역할을 하는 리액티브 프로그래밍을 위한 라이브러리
Reactor 특징
- Reactor는 Reactive Streams를 구현한 리액티브 라이브러리
- Non-Blocking은 리액티브 프로그래밍의 핵심적 특징
- Reactor도 완전한 Non-Blocking 통신 지원
- Non-Blocking : 요청 쓰레드가 차단되지 않음
- Reactor는 Publicher 타입
- Reactor 제공 Publisher
- Mono[0|1] : 0건 또는 1건의 데이터를 emit 가능
- Flux[N] : 여러 건의 데이터를 emit 가능
- Reactor 제공 Publisher
- Non-Blocking 통신을 지원하는 Reactor는 MSA 구조에 적합한 라이브러리
- MSA(Microservice Architecture) 기반 애플리케이션들은 Blocking 통신을 사용하기에는 무리
- 서비스들간의 통신이 잦으므로 요청 쓰레드가 차단되면 안됨
- MSA(Microservice Architecture) 기반 애플리케이션들은 Blocking 통신을 사용하기에는 무리
- Reactor는 Backpressure 전략을 잘 지원해줌
- 🔗Backpressure
- Subscriber의 처리 속도가 Publihser의 emit 속도를 따라가지 못할 때 적절하게 제어하는 전략
- 리액티브 프로그래밍은 끊임없이 들어오는 데이터를 적절하게 처리해야함
- Publisher에서 들어오는 데이터 emit에 비해 Subscriber의 처리속도가 느리면 처리되지 않은 대기 데이터가 지속적으로 쌓이게됨
- 처리되지 않은 대기 데이터가 쌓이는 것을 방치하게되면 오버플로우 발생
- 시스템 다운 가능성도 존재
- Subscriber의 처리 속도가 Publihser의 emit 속도를 따라가지 못할 때 적절하게 제어하는 전략
Marble Diagram
- Marble Diagram
- 시간의 흐름에 따라 변화하는 데이터의 흐름을 표현한 다이어그램
- 구슬모양의 알록달록한 동그라미는 하나의 데이터를 의미
- Reactor 제공 Operator의 내부동작을 이해하는데에 도움
- Operator를 적절하게 사용하는데에 도움
- 🔗Marble Diagram
Scheduler
- Thread를 관리하는 관리자 역할
- Reactor의 Scheduler는 복잡한 멀티쓰레딩 프로세스를 단순하게 해줌
- Reactor Sequence 상에서 처리되는 동작들의 하나 이상의 쓰레드에서 동작하도록 별도의 쓰레드를 제공해줌
- Non-Blocking 통신을 위해 여러 쓰레드를 손쉽게 관리해주기 때문에 Reactor에서 굉장히 중요함
Scheduler 전용 Operator
subscribeON()
- 데이터 소스에서 데이터를 emit하는 원본 Publisher의 실행 쓰레드를 지정하는 역할
- 구독 직 후 실행되는 Operator 체인의 실행 쓰레드를 지정한 쓰레드로 변경
- ex) subscribeOn(Schedulers.boundedElastic())
- 실제로 Schedulers.boundedElastic()를 자주 사용함
- 여러번 추가해도 한번만 생성
doOnSubscribe()
- 구독 발생 직 후에 트리거 되는 Operator
- 구독 직 후 수행하고싶은 동작 작성
publichOn()
- 전달 받은 데이터를 가공 처리하는 Operator 앞에 추가해서 실행 쓰레드를 별도로 추가하는 역할
- 추가할 때 마다 추가한 publishOn()을 기준으로 Downstream쪽 쓰레드가 지정한 쓰레드로 변경
- ex) publishOn(Schedulers.parallel())
doOnNext()
- 바로 앞에 위치한 Operator가 실행될 때 트리거 되는 Operator
구독 직 후의 실행 쓰레드와 Operator 체인마다 실행 쓰레드를 구분한 이유
- Spring WebFlux 기반의 애플리케이션은 적은 수의 쓰레드로 대량의 요청을 Non-Blocking 방식으로 처리할 수 있는 구조
- 쓰레드가 직접 복잡한 계산을 수행할 경우에는 응답 처리 시간이 늦어짐
- 복잡한 계산이 필요한 작업의 경우 서버 엔진에서 생성하는 요청 처리 쓰레드가 응답 지연이 발생하지 않도록 별도의 쓰레드가 필요
- Scheduler를 통해 별도의 쓰레드를 생성한 후, 복잡한 계산을 수행시켜서 응답 지연이 발생하지 않도록 함
종류별 Operators
'Spring' 카테고리의 다른 글
[Spring WebFlux] Reactive Programming (0) | 2023.01.09 |
---|---|
[Spring] JPA Entity Mapping (0) | 2022.12.21 |
[Spring] JPA (0) | 2022.12.21 |
[Spring] JDBC (0) | 2022.12.21 |
[Spring] 예외 처리 (0) | 2022.12.21 |