응답성 (Responsiveness)
응답성은 시스템이 시간 내에 반응하거나 응답해야 함을 의미한다. Spring WebFlux는 논블로킹 특성을 통해 이를 달성한다.
Non-blocking I/O
- Spring WebFlux는 서블릿 3.1 이상의 API 또는 Netty 같은 논블로킹 웹 컨테이너를 기반으로 한다.
- 이는 I/O 작업이 완료될 때까지 스레드가 대기하지 않고 즉시 다른 작업을 수행할 수 있도록 한다.
- 결과적으로 적은 수의 스레드로도 훨씬 많은 요청을 처리할 수 있으며 이는 지연 시간을 줄이고 처리량을 증가시킨다.
리액티브 스트림즈 (Reactive Streams)
- Publisher와 Subscriber 모델을 사용하여 데이터 흐름을 비동기적으로 처리한다.
- 데이터가 준비되는 즉시 스트리밍되므로 모든 데이터가 수신될 때까지 기다릴 필요 없이 즉시 클라이언트에 응답을 보낼 수 있다.
- 이는 대용량 데이터 처리나 실시간 스트리밍 시나리오에서 응답성을 크게 향상시킨다.
백프레셔 (Backpressure)
- 과도한 데이터 흐름으로 인해 Subscriber가 압도당하지 않도록 Publisher가 데이터 전송 속도를 조절하는 메커니즘을 제공한다.
- 이는 시스템이 과부하에 빠지는 것을 방지하여 안정적인 응답성을 유지하는 데 기여한다.
회복성 (Resilience)
회복성은 시스템이 실패가 발생하더라도 응답성을 유지하는 능력을 의미한다.
Spring WebFlux는 다음과 같은 방식으로 회복성을 지원한다.
격리 (Isolation)
- Spring WebFlux의 논블로킹 특성 요청의 실패가 다른 요청에 영향을 미칠 가능성을 줄인다.
- 전통적인 블로킹 모델에서는 하나의 블로킹 작업이 스레드를 오랫동안 점유하여 스레드 풀 고갈을 야기하고 전체 시스템의 응답 불능으로 이어질 수 있다.
- Spring WebFlux는 스레드를 점유하지 않으므로 하나의 실패가 전체의 시스템에 미치는 영향을 최소화환다.
비동기 오류 처리
Mono와 Flux 같은 리액티브 타입은 오류를 데이터 스트림의 일부로 처리할 수 있도록 한다.
onErrorResume, onErrorReturn, retry, doOnError등의 연산자를 사용하여 오류 발생 시 대체 동작을 정의하거나 특정 횟수만큼 재시도하거나 오류를 다른 형태로 변환하여 전파할 수 있다.
- 이는 시스템이 부분적 실패에도 불구하고 정상적으로 동작하도록 돕는다.
서킷 브레이커(Circuit Breaker) 패턴과의 연동
- Spring Cloud Circuit Breaker 같은 라이브러리와 쉽게 통합될 수 있다.
- 이는 외부 서비스 호출 실패 시 즉시 실패를 반환하여 해당 서비스에 대한 추가 요청을 막고 시스템 전체가 지연되거나 멈추는 것을 방지한다.
탄력성 (Elasticity)
탄력성은 시스템이 부하 변화에 따라 자원을 동적으로 확장하거나 축소할 수 있는 능력을 의미한다.
Spring WebFlux는 논블로킹 특성 덕분에 적은 자원으로 더 많은 처리량을 달성하여 탄력성을 높인다.
효율적인 자원 활용
- 블로킹 모델에 비해 훨씬 적은 수의 스레드로도 높은 동시성을 처리할 수 있다.
- 이는 서버의 CPU 및 메모리 사용량을 줄여 더 많은 요청을 동일한 하드웨어에서 처리할 수 있게 한다.
- 트래픽이 증가하더라도 더 적은 수의 인스턴스로 대응할 수 있다.
- 이는 클라우드 환경에서 자원 프로비저닝 효율성을 높인다.
논블로킹과 확장성
- 논블로킹 특성은 수평적 확장을 용이하게 하는 것이다.
- 각 인스턴스가 더 많은 요청을 처리할 수 있으므로 동일한 처리량을 위해 더 적은 인스턴스를 유지하거나 동일한 인스턴스로 더 많은 부하를 처리할 수 있다.
- 이는 오토 스케일링 그룹과 같은 클라우드 환경의 탄력성 기능을 활용하기에 매우 적합하다.
메시지 구동 (Message Driven)
메시지 구동은 시스템의 컴포넌트들이 비동기적으로 메시지를 통해 상호작용하는 것을 의미한다.
Spring WebFlux는 내부적으로 메시지 구동 원칙을 따르며 외부 시스템과의 통합에서도 이를 효과적으로 지원한다.
리액티브 스트림즈의 메시지 전달
- 리액티브 스트림즈는 Publisher가 데이터를 생성하고 Subscriber가 이를 소비하는 방식으로 동작한다.
- 여기서 데이터는 메시지의 형태로 간주될 수 있다.
- 메시지 전달은 비동기적으로 이루어진다.
- 이는 곧 시스템 내부의 컴포넌트 간 통신을 메시지 기반으로 설계할 수 있도록 해준다.
비동기 이벤트 처리
- WebFlux는 웹 요청을 비동기 이벤트 스트림으로 처리한다.
- 들어오는 요청은
Mono또는 Flux로 변환되어 처리되고 응답 또한 비동기적으로 스트리밍 된다.
- 이는 전통적인 요청-응답 모델을 넘어선 실시간 이벤트 처리 및 스트리밍 애플리케이션 개발에 적합하다.
백앤드 시스템과의 연동
- WebFlux는 Kafka, RabbitMQ와 같은 메시지 브로커 또는 RSocket과 같은 리액티브 통신 프로토콜과의 연동을 위한 리액티브 클라이언트를 제공한다.
- 이를 통해 비동기적이고 메시지 구동적인 방식으로 다른 마이크로서비스나 메시징 시스템과 통신할 수 있다.
- 예를 들어 메시지 큐에 이벤트를 발행하거나 구독하여 시스템 간의 느슨한 결합을 유지하고 독립적인 확장을 가능하게 한다.
결론
Spring WebFlux는 리액티브 선언문의 네 가지 핵심 특성을 논블로킹 I/O, 리액티브 스트림즈 그리고 효율적인 자원 관리 및 비동기 통신 메커니즘을 통해 완벽하게 구현함으로써 현대적인 고성능, 고가용성 분산 시스템을 구축하는 데 강력한 기반을 제공한다.