매일 매일, 차곡 차곡 쌓기



완벽하지 않은 것을 두려워 말며,
완성도를 높히는데 집중하자.

Spring/Webflux

Reactive Programming 2

blockbuddy93 2024. 3. 1. 16:19

 

1. 전통적인 REST API Design

  • 명령형 코딩 스타일이며, 하향 접근방식으로 진행됨
  • 각 단계에서 응답이 오기 까지 Block 되며, 동기적으로 로직이 수행됨
  • 이러한 명령형 코딩 스타일로 인해 스레드가 완전히 처리되기 전까지 Blocking 이 일어나고 리소스가 비효율적으로 사용되고 있음

 

1.1 전통적인 REST API Design 개선

  • 호출을 비동기식으로 하며, 기본적으로 Non blocking 여야 합니다.
  • 자바에서는 Callback 과 Futures 방식이 있습니다.

1.1.1 Callback

  • 기본적으로 복잡하고 좋은 옵션이 아닙니다.
  • 콜백은 어떤 값도 반환하지 않지만, 콜백 인스턴스를 매개변수로 사용합니다.
  • 콜백 코드는 각 수준에서 예외를 처리하는 특성을 갖고 있으며, 코드를 읽기, 유지보수가 어렵습니다.

1.1.2 Future

  • Futrue는 Future 인스턴스를 반환하고, Future 인스턴스를 사용하여 데이터가 사용 가능한지 확인할 수 있습니다.
  • 하지만 여러 비동기 작업을 구성하기는 어렵습니다.

1.1.3 Completable Future

  • 함수형 스타일을 지원하는 API
  • 여러 비동기 작업을 구성하기에 쉬움
  • 하지만 응답에 여러항목이 포함되고 오류처리가 포함된 비동기 메서드에는 적합하지 않음. 제대로 작동하려면 많은 파이프라인 코드가 필요

1.2 한계

  • 과도하게 로드 되는 경우 어플리케이션은 OOM이 발생할 수 있습니다.
  • 클라이언트 측면에서도 과도한 데이터처리로 인해 문제가 될 수 있습니다.

  • 또한 전통적인 방식에서는 클라이언트가 DB 측에 백프레셔를 할 수 있는 방법이 없어서 한계상황을 극복할 수 없습니다.

 

2. 더 나은 디자인을 위해선?

  • 비동기 처리와 Non-Blocking 을 이용
  • Thread per request model 에서 벗어나 적은 수의 스레드로 요청을 효과적으로 처리하기
  • Backpressure 기능 갖추기

'Spring > Webflux' 카테고리의 다른 글

Creating a new sequence  (0) 2024.03.04
R2DBC  (0) 2024.03.02
Reactive Programming  (0) 2024.03.01
Context  (0) 2024.03.01
Scheduler의 종류  (0) 2024.02.29