Webflux 란?

2022. 5. 15. 16:50·BE 개발/spring webflux
728x90

1. WebFlux

 

1-1. 등장 배경

1. 기존 MVC 관점
  • 기존 방식
    • 서버에서 다른 요청을 못받는다.
    • 이를 스레드를 늘려 시간을 쪼개서 일을 진행하는데 이 경우 context switching 문제가 생긴다.
  • 문제점
    1. A와 B에 멍때리는 시간이 존재한다. 그 시간에 다른일을 못한다. : 비동기 처리로 해결
    2. 물어봐야만 알고싶은 정보를 알 수 있다. : 응답을 유지하여 해결
  • 비동기 처리
    • DB가 서버에게, 서버가 클라이언트에게 즉각적인 응답을 해준다.
    • 서버는 이 이후 다른 일을 진행할 수 있다.
    • 서버는 미처 처리하지 못한 이벤트를 기억해야 하고 이를 이벤트 루프에 저장하여 기억한다.
    • 이벤트 루프덕분에 서버는 여러가지 요청을 동시에 받고 기억할 수 있어 비동기 처리가 가능해진다.
  • 응답 유지
    • Stream을 만들어 놓는다. (물길을 유지한다.)
    • 요청과 응답의 선을 만들어놓고 계속 통신 : webSocket
    • 요청이 필요없어 요청을 끊고 응답만 지속적으로 유지 : SSE 프로토콜

이벤트 루프와 SSE 프로토콜 방식으로 Reactive Programming을 할 수 있다. 이를 spring에 적용한게 WebFlux


2. servlet 관점
  • Servlet의 변화
    • Servlet 3.0 미만 [ 동기 / 블록킹 ]
    • Servlet 3.0 [ 비동기 / 블록킹 ]
      • Async Servlet (비동기 서블릿) 개념이 도입됨
      • 사용자의 요청을 받는 스레드 & 작업을 수행하는 스레드를 분리할 수 있게 되었다.
    • Servlet 3.1+ [ 비동기 / 논블록킹 ]
      • Non-Blocking I/O가 가능해짐
      • request/response 를 처리하는 I/O를 non-blocking하게 수행 가능
      • NIO를 위한 API를 제공

*WebFlux라는 이름을 가진 Spring의 Reactive-Stack의 등장*


- - -


1-2. WebFlux 특징

  • Reactive-Stream 라이브러리를 기반으로 만들어진 구현체
  • Spring 5 (Springboot 2) 에서 새롭게 추가된 모듈
  • client / server 에서 reactive 스타일의 어플리케이션 개발을 도와주는 모듈
  • non-blocking에 reactive stream을 지원
  • Spring Web MVC 와 Spring Web Flux를 동시에 사용할 수 있다.
    • MVC가 기본으로 적용되며 MVC controller에 reactive WebClient를 함께 사용 가능
    • 현재 회원통합 프로젝트가 그러하다?
  • 웹 어플리케이션이 각 Layer들이 Reactive 하게 개발됐더라도 DB가 Reactive를 지원하지 않는다면 결국 DB에서 blocking 되기 때문에 사실 의미가 없다.
  • RDBMS는 비동기 처리가 불가능하다.
    • MongoDB, Redis 등은 지원
    • R2DBC 라이브러리를 통해 DB에서 비동기 처리가 가능 (MySQL, Postgres, H2, mssql)

1-3. WebFlux의 장점

  • netty 지원
    • NIO(Non-Blocking Input Ouput) 클라이언트 서버 프레임 워크
    • 그 외에도 Servlet 3.1+ Container 를 포함한 다양한 reactive runtime 지원 (tomcat, reactor etc.)
  • 비동기 non-blocking 메세지 처리
  • Back Pressure
    • 빠른 Publisher - 느린 Subscriber 문제를 해결하는 원리
    • Publisher의 일방적 데이터 Push 가 아니라, Subscriber가 처리할 수 있을 만큼의 데이터만 Subscriber의 요청에 의해서 전달

 


1-4. 그래서 왜 WebFlux를 쓰지?

  • 일반적으로 많은 트래픽을 소화하는 시스템은 리소스 최적화가 필요하다.
    • 하나의 사용자 요청을 처리하기 위해 수십개의 외부 시스테에 대한 요청이 필요한 시스템에서 빠른 응답을 줘야 한다.
  • Spring MVC는 1:1 로 요청을 처리하기에 트래픽이 몰리면 많은 스레드가 생긴다. 스레드 전환의 context switching 비용이 발생하는데, 이는 스레드가 많을 수록 비용이 커지므로 스레드 수를 유지하는 것이 중요하다.
  • 이에 반해 WebFlux는 적은 양의 스레드와 최소한의 하드웨어 자원으로 효율적인 동시성 핸들링이 가능하다.
    • request를 Event-Driven 방식으로 처리
    • 비동기 / non-blocking I/O 사용
728x90
저작자표시 (새창열림)

'BE 개발 > spring webflux' 카테고리의 다른 글

동기 / 비동기 / 블록킹 / 논블록킹  (0) 2022.05.15
'BE 개발/spring webflux' 카테고리의 다른 글
  • 동기 / 비동기 / 블록킹 / 논블록킹
gudwnsgur
gudwnsgur
IT
    250x250
  • gudwnsgur
    gudwnsgur
    gudwnsgur
  • 전체
    오늘
    어제
    • 분류 전체보기
      • 개발이야기
      • Spring
        • 이슈 해결
      • JPA
        • spring data jpa
      • Java
        • Java의 정석
      • Kotlin
        • Kotlin In Action
        • Kotlin 정리
      • 대규모 시스템 설계 기초
      • JavaScript
        • JS ES6+
      • 면접
        • CS
      • SQLD
      • BE 개발
        • spring webflux
  • 블로그 메뉴

    • 홈
    • 태그
    • 방명록
  • 링크

  • 공지사항

  • 인기 글

  • 태그

    cookie
    HTTP
    session
    대규모 시스템 설계 기초
  • 최근 댓글

  • 최근 글

  • hELLO· Designed By정상우.v4.10.3
gudwnsgur
Webflux 란?
상단으로

티스토리툴바