Spring/Webflux
Backpressure
blockbuddy93
2024. 2. 29. 15:06
1. Publisher와 Subscriber 간의 프로세스
- subscribe : Subscriber에서 subscribe 를 호출하여 구독
- onSubscribe : Publisher에서 구독이 정상적으로 이루어졌음을 알리는 onSubscribe 시그널 발생
- request : Subscriber는 Publisher에게 request 시그널로 데이터 요청
- onNext : Publisher는 전달받은 request 시그널에 해당하는 onNext 시그널을 Subscriber에게 전송하면서 데이터를 emit
- onComplete : Publisher측에서 emit 할 데이터가 없으면 Subscriber에게 onComplete 시그널을 발생
- onError : 데이터를 emit하는 과정중에서 에러가 발생하게 되면 onError 시그널을 보내게 되면서 Publisher와 Subscriber간 프로세스가 종료
2. Backpressure란?
- Publisher에서 emit되는 데이터를 Subscriber 쪽에서 안정적으로 처리하기 위한 제어 기능
- Subscriber 측에서 데이터를 처리하지 못한 경우, Publisher 에서 emit한 데이터가 계속 누적
- 최악의 경우 데이터가 쌓이면서 시스템이 다운될 수 있으며, 이를 방지하기 위해서 리액티브 프로그래밍에서 Backpressure 기능은 반드시 필요
3. 1 Reactor에서 Backpressure 처리 방법
- 요청 데이터의 개수를 제어하는 방법
- Subscriber가 적절히 처리할 수 있는 수준의 데이터 개수를 Publisher에게 요청. (가장 기본적인 Backpressure 처리 방법)
- Reactor에서 제공하는 Backpressure 전략
3.2 Reactor Backpressure 전략
- IGNORE 전략 : Backpressure를 적용하지 않음
- ERROR 전략 : Downstream으로 전달할 데이터가 버퍼에 가득 찰 경우, Exception을 바생시키는 전략
- DROP 전략 : Downstream으로 전달할 데이터가 버퍼에 가득 찰 경우, 버퍼 밖에서 대기하는 먼저 emit 된 데이터부터 Drop 시키는 전략
- LATEST 전략 : Downstream으로 전달할 데이터가 버퍼에 가득 찰 경우, 버퍼 밖에서 대기하는 최근에(나중에) emit 된 데이터 부터 버퍼에 채우는 전략
- BUFFER 전략 : Downstream으로 전달할 데이터가 버퍼에 가득 찰 경우, 버퍼 안에 있는 데이터를 Drop 시키는 전략
3.3 Reactor Backpressure DROP 전략
3.3 Reactor Backpressure LATEST 전략
3.3 Reactor Backpressure BUFFER DROP-LATEST 전략
3.4 Reactor Backpressure BUFFER DROP-OLDEST 전략