[Async] Spring Event 비동기 프로그래밍

SJ.CHO·2024년 10월 7일

Sync VS Async

Sync

  • 하나의 Thread가 프로그램의 코드를 순차적으로 실행하는 것.
  • 한순간에 반드시 하나의 코드만 실행, 이전코드의 실행이 완료되어야함.

Async

  • 하나의 Thread가 특정코드의 실행을 다른 Thread에 요청.
  • 여어 Thread에 의해 동시에 여러개의 코드가 실행

Sync와 Async 은 Thread, Blocking & Non-Blocking 은 기다림.
(면접 자주 나옴)

JAVA에서의 비동기

  • Thread, Runnable
  • ExecutorService (Thread Pool)
  • Callable & Future
  • Virtual Thread

SpringBoot APP 이 HTTP요청을 처리하는 과정

  • 기본적으로 SpringBoot 는 Multi Thread 기반으로 동작.
  • 요청 1: Thread 1 단위로 전담함. (Thread per Request Model)
    • Thread 수 이상의 트래픽이 발생한다면?
      • 작업 대기 Queue 에 인원들이 대기하게된다.
  • SpringBoot의 APP Code 는 여러 Thread에 의해 동시에 실행되는것을 가정해야함
  • Worker Thread : MainThread 내에서 비동기처리를 위한 새로운 Thread 생성

언제 비동기를 떠올릴수 있는가?

  • HTTP 응답이 나갈때 바로 동작할 필요가 없는 동작.
    • 사용자 알림 전송 등 (비즈니스 로직이 영향을 주지않는 동작)
  • 처리시간이 오래걸려 HTTP 응갑시간에 영향을 줄수 있는 동작
    • E-mail 전송 로직, 회원가입 등
  • 결합도가 낮고 결과적 일관성이 보장되는걸로 충분한 동작
    • 상품구매시 포인트적립

전체적으로 Flow에서 영향 과 작업에 대한 시간의 영향을 받지않는 작업들

Event

  • 주 목적은 두 Component 사이의 의존성 & 관심사의 분리로 인한 결합도하락. (Loosely Coupling)

    • 변경의 전파 차단
    • 관심사의 대한 분리
    • 장애의 전파 차단 (프로세스단위의)
    • 각각의 서비스의 독립적인 확장이 가능함 (Scale Out)
  • Spring Event 는 동기식 으로 동작함. (@Async 를 이용해 비동기방식 변경가능)

  • 단점 :

    • 전체적인 시스템 복잡도를 높히고 흐름을 파악하기 어렵다.
    • Event의 포맷이 결정되고나면 쉽게 변경하기 어렵다.(의존성 높음)
    • 별도의 인프라구성 및 Event 중복, 순서등 시스템적 고려사항이 많아짐.

심화

  • 리소스효율성 측면에서 Non-blocking 한 방식이 필요한 이유는무엇일까?
profile
70살까지 개발하고싶은 개발자

0개의 댓글