Spring WebClient + MVC (1) Sync, Async, Blocking, Non-Blocking

#spring mvc#webclient

2023-10-20 04:44

대표 이미지

Spring MVC에서 WebClient를 적용하기 위한 사전 지식들을 정리하는 시리즈물로써, 핵심 개념 및 중요 요소들을 설명합니다. 이번 글에서는 중요 개념인 Concurrency, sync, async, blocking, non-blocking에 대해서 정리합니다.

개요


첫번째 포스트에서는 Blocking 모델 기반의 Spring MVC 환경에서 async 기반의 HTTP 클라이언트인 WebClient를 적용하기 위해, Concurrency 및 주요 속성인 sync, async 및 blocking, non-blocking에 대해서 정리한다.

Concurrency


Concurrency(동시성)이란 싱글 코어에서 멀티 스레드 환경을 구성하여 Context Switching을 통해 동시에 실행되는 것처럼 보이게 하는 것을 의미한다. 이를 통해 여러 작업을 효율적으로 분할하고, CPU의 사용률을 극대화하여 전체 시스템의 처리량과 응답 시간을 개선할 수 있다.

Sync, Async, Blocking, Non-blocking


동시성 여부를 결정하는 주요 속성은 비동기성과 블로킹  모드로 구성된다.

비동기성

  • Sync
    • 요청과 응답이 순차적으로 진행한다.
    • 요청을 보낸 후 해당 작업이 완료되기 전까지 기다려야 한다.
    • 여러 개의 함수 호출시 호출한 순서대로 응답한다.
  • Async
    • 요청을 보낸 후 응답을 기다리지 않고 다른 작업을 진행한다.
    • 응답이 올 때까지 다른 일을 계속할 수 있으며, 응답이 오면 그 때 처리한다.
    • 여러 개의 함수 호출시 어떤게 먼저 응답할지 모른다.

블로킹 모드

  • Blocking
    • 자원(CPU, 메모리, 네트워크, 함수 등)을 사용하려고 할 때, 사용가능할 때까지 대기한다.
    • 함수 호출을 받은 쪽에서 처리가 끝나고 나서 응답 → 제어권을 함수 호출받은 쪽에서 가지고 있음
  • Non-blocking
    • 자원이 즉시 사용 가능하지 않더라도 대기하지 않고 바로 반환한다.
    • 함수 호출을 받은 쪽에서 처리가 끝나기 전에 응답 → 제어권을 함수 호출한 쪽에서 가지고 있음

I/O 모델


비동기성과 블로킹 모드 조합에 따른 I/O 모델 (IBM Developer ) sync_1.png 각 모델별 프로세스의 이해를 돕기 위해 작업 요청을 지시한 Caller, 작업을 수행하는 Callee로 구분한다.

Sync Blocking I/O Model

  • 가장 보편적인 모델 
  • synchronous : Callee가 응답할 때 결과가 담겨 있다.
  • blocking : Caller는 Callee의 작업이 완료될 때까지 대기한다.

sync_2.png

Sync Non-blocking I/O Model

  • Polling 기반의 I/O 작업에 사용됨 - 작업이 완료되지 않은 상황에서 상태를 계속 확인 ex) 대량 메시지 전송 요청 후 요청되는 시간동안 상태를 주기적으로 체크하고 중간에 발송을 중단할 수 있다.
  • synchronous : Callee가 응답할 때 결과가 담겨 있다. (중간에 응답을 하긴 하나 결과가 담겨있지 않은 상태 객체 반환)
  • non-blocking : Calle의 작업이 완료되기 전에 바로 반환하여 Caller의 작업을 이어서 진행한다.

sync_3.png

Async Blocking I/O Model

  • 비효율적이라 거의 사용되지 않는 모델
  • asynchronous : Callee는 응답 시간과 결과를 가져오는 시간이 다르다.
  • blocking: Callee의 작업이 완료될 때까지 Caller는 대기한다.
  • Caller는 바로 응답은 받은 상태이지만 blocking 상태로 Callee가 끝날 때까지 대기하다가 신호를 받으면 결과를 가져온다.
  • 직접 사용되지는 않고 asyncronous non-blocking 모델 중 blocking으로 동작하는 작업이 있을 경우 의도와 다르게 async non-blocking으로 동작한다. ex) Node.js와 MySQL 사용하는 경우 Node.js는 비동기지만 MySQL 드라이버가 blocking이라 asyncronous blocking 방식으로 동작.

sync_4.png

Async Non-Blocking I/O Model

  • I/O 작업중에 다른 프로세스를 진행할 수 있는 장점이 있는 모델
  • asynchronous : Callee의 응답 시간과 결과를 가져오는 시간이 다르다.
  • non-blocking : Callee의 작업이 완료되기 전에 바로 반환하여 A의 작업을 진행한다.
  • Callee에게 요청후 Caller가 다른 작업을 진행하다가 Callee의 결과가 나오면 응답을 받아서 처리한다.

sync_5.png