ct-study / designing-data-intensive-applications

2 stars 0 forks source link

[8주차] Reactive Streams의 Back Pressure (p.438) #40

Open wbluke opened 9 months ago

wbluke commented 9 months ago

Spring Webflux의 배압 처리

https://techblog.woowahan.com/2667/

gilteunchoi commented 9 months ago

이걸 보고 생각난 톰캣 NIO와 작업큐, 스프링부트의 다중 요청 처리: https://velog.io/@sihyung92/how-does-springboot-handle-multiple-requests

톰캣의 NIO와 작업큐를 활용해서 spring boot 가 무한한 요청을 받도록 하는 것도 reactive stream의 일종이라고 볼 수 있을까? 둘 다 backpressure 관리를 한다는 점에서는 비슷하잖아?

ChatGPT:

Reactive programming과 NIO(Non-blocking I/O)를 사용하는 것은 비동기 및 이벤트 기반 프로그래밍의 한 형태로 볼 수 있습니다. Spring Boot에서는 Reactor 프로젝트를 통해 리액티브 프로그래밍을 지원하고 있습니다.

NIO는 Java의 I/O 작업을 비동기적으로 처리할 수 있게 하는 기술이며, 이는 블로킹되지 않는(non-blocking) 방식으로 입출력 작업을 수행할 수 있도록 합니다. 이러한 특성은 많은 클라이언트의 요청을 동시에 처리할 수 있게 해주며, 이는 무한한 요청을 처리하는 데 도움이 될 수 있습니다.

Spring Boot에서 Reactive Streams는 Reactor와 함께 사용되어 비동기 및 반응형 프로그래밍을 지원합니다. Reactor는 Project Reactor라는 리액티브 스트림 구현을 제공하며, 이를 사용하여 백프레셔(backpressure)를 관리할 수 있습니다.

백프레셔는 소비자가 생산자로부터 받을 수 있는 데이터의 양을 제어하는 메커니즘으로, 생산자와 소비자 간의 데이터 흐름을 균형있게 유지합니다. 이것은 리액티브 시스템에서 중요한 개념 중 하나이며, 특히 대량의 비동기 이벤트를 다루는 경우에 중요합니다.

따라서 톰캣의 NIO와 작업 큐를 사용하여 Spring Boot 애플리케이션이 무한한 요청을 받도록 하는 것은 리액티브 스트림의 일종으로 볼 수 있습니다. 둘 다 비동기 및 이벤트 기반 프로그래밍을 통해 대량의 요청을 효과적으로 처리하도록 도와주는 기술이기 때문입니다.

GPT가 맞는 말을 한 것일까(요)?

wbluke commented 9 months ago

좋은 접근이네요. 제 생각을 미리 이야기하자면, NIO를 활용해서 이벤트 기반 프로그래밍과 back pressure를 구현한다고 하더라도 이게 Reactive Streams라고 보기는 힘들지 않을까 합니다. 즉, 충분 조건은 될 수 있는데 필요 조건은 아닌 것 같아요. (Reactive한 시스템이다. 라고는 말할 수 있겠습니다.)

정리하면 Reactive Streams는 Reactive 시스템의 표준 API 스펙입니다. Reactive Streams의 가장 큰 특징이 Non-blocking과 back pressure이긴 하지만, 이는 특징이지 Reactive Streams의 스펙이라고 하지는 않기 때문입니다. Reactive Streams의 스펙을 간단하게 나타내면 아래와 같습니다.

onSubscribe onNext* (onError | onComplete)?
xogml123 commented 9 months ago

영세 업체에서는 새로운 기술까지 도입해서 위험성을 높일 필요는 없는 것 같다.