Choi G.J bio photo

Choi G.J

IT System Engineer

Overview

WebFlux vs Spring MVC

Webflux vs Spring MVC 성능테스트 비교

환경 준비

테스트 어플리케이션군

  1. WRM (WebfluxReactiveMongo)
    • 웹플러스 + 리엑티브 몽고
    • 스프링 부트(2.1.5.RELEASE) + Webflux + reactiveMongo (spring-data-mongo:2.1.8 + mongodb-driver/driverasync:3.8.2)
  2. WM(WebfluxMongo)
    • 웹플럭스 + 블락 몽고
    • 스프링 부트(2.1.5.RELEASE) + Webflux + mongo (spring-data-mongo:2.1.8 + mongodb-driver:3.8.2)
  3. MM(springMvcMongo)
    • 스프링 MVC + 블락 몽고
    • 스프링 부트(2.1.5.RELEASE) + Spring web mvc + mongo (spring-data-mongo:2.1.8 + mongodb-driver:3.8.2)

테스트 서버 환경

종류 pods cpu memory
kubenetes (docker image) 각 1개 single구성 4c 4Gi

테스트 수행

1) 조회 요청성능 측정

  1. 인증 API ( JWT 토큰 인증) - Query(findById)
  2. 인증없는 Open API - Query(findById)

테스트 결과 조회성능테스트

모든 요청성능(TPS 및 응답속도) 에 대해서 아래 순위를 보인다. (20~30% 웹플럭스가 성능이 좋음)

1위) 웹플럭스 + 리엑티브 몽고 2위) 웹플러스 + 블락 몽고 3위) Spring MVC + 블락 몽고

2) 조회시 쿼리 종류별 성능비교

  1. 기본 쿼리 ( findById )
  2. 커스톰 쿼리 ( findByUserId)

쿼리성능테스트

기본 ID 조회 쿼리가 10%정도 TPS 및 응답속도가 좋음

3) 저장 요청성능 측정

  1. 인증 API ( JWT 토큰 인증) - Query(save with userId)
  2. 인증없는 Open API - Query(save)

저장성능테스트

조회와 마찬가지로, Webflux가 우위를 보임 (1,480 요청시 MM > WM 인 결과가 보이지만 테스트시 오차로 생각됨)

4) 외부 API 호출 비교

RestTemplate 와 Webclient 성능 비교

API성능테스트

웹플럭스 + web client 가 MVC RestTemplate 보다 30%가량 성능이 좋게 나옴 Spring MVC를 쓰더라도 Webclient를 쓰면 미미한 차이긴하지만 5~10% 성능향상 효과가 있는듯함

추가 알게 정보 및 시행착오

JWTToken관련 성능

스프링Security로 토큰 인증체크 공통모듈을 적용 하는 경우 성능을 꽤 잡아먹음.

웹플럭스의 경우는 -15%, Spring MVC경우 -35% 정도 ( 구현방식이 좀 달라서, MVC에 구현된 인터셉터 방식이 좀 더 잡아먹는듯 )

로깅관련 성능

최초 성능 측정시, 실수로 웹플럭스에 TRACE로거를 걸어놓은채 성능테스트가 이루어져서 약 10~15% 스프링 MVC가 성능이 좋게 나옴…

로거실수성능테스트

TRACE로거를 제거한 후 웹플럭스는 30% 이상이 성능향상이 있었음.

총평

  • 웹플럭스 자체로도 성능은 뛰어남.
  • Webflux + Reactive DB 조합으로 사용되어야 더 좋은 효율을 뽑아낼 수 있다.
  • RestTemplate을 사용하지 말고 webclient를 사용하자. ( SpingMVC를 쓰더라도 )
  • 성능향상을 보기 위해 비교적 코딩복잡도가 있는 웹플럭스를 도입할지는 선택의 몫이다.