Reactor 백프레셔는 생산자가 소비자보다 빠를 때 메모리를 지킬까?
Flux가 구독자보다 빠르게 값을 만들면 중간 버퍼가 쌓이거나 값이 사라지거나 오류가 납니다. Reactor 3.8.7에서 요청을 지키지 않는 같은 생산자에 onBackpressureBuffer·Drop·Latest를 붙여, request(n)이 오가는 모습과 힙, 잃은 값의 개수를 비교합니다.
@Hong2026-10-14조회 289
Flux가 구독자보다 빠르게 값을 만들면 중간 버퍼가 쌓이거나 값이 사라지거나 오류가 납니다. Reactor 3.8.7에서 요청을 지키지 않는 같은 생산자에 onBackpressureBuffer·Drop·Latest를 붙여, request(n)이 오가는 모습과 힙, 잃은 값의 개수를 비교합니다.
Reactor 체인은 subscribe를 부른 스레드에서 실행되다가 publishOn과 subscribeOn을 만나는 지점에서 스레드가 바뀝니다. 연산자를 어디에 붙이는지, 여러 번 쓰면 어느 쪽이 적용되는지를 Reactor 3.8.7 콘솔 프로그램의 스레드 이름 출력으로 확인합니다.
WebFlux는 CPU 수에 맞춘 몇 개의 이벤트 루프 스레드로 모든 요청을 처리하기 때문에, 그 스레드에서 JDBC나 Thread.sleep 같은 블로킹 호출을 하면 상관없는 요청까지 함께 멈춥니다. Spring Boot 4.1에서 2초짜리 블로킹 요청 네 개가 0.02초짜리 엔드포인트를 1.8초까지 늦추는 과정을 재현하고, boundedElastic으로 격리했을 때와 비교합니다.