Overview
WebFlux vs Spring MVC
Webflux vs Spring MVC 성능테스트 비교
환경 준비
테스트 어플리케이션군
- WRM (WebfluxReactiveMongo)
- 웹플러스 + 리엑티브 몽고
- 스프링 부트(2.1.5.RELEASE) + Webflux + reactiveMongo (spring-data-mongo:2.1.8 + mongodb-driver/driverasync:3.8.2)
- WM(WebfluxMongo)
- 웹플럭스 + 블락 몽고
- 스프링 부트(2.1.5.RELEASE) + Webflux + mongo (spring-data-mongo:2.1.8 + mongodb-driver:3.8.2)
- 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) 조회 요청성능 측정
- 인증 API ( JWT 토큰 인증) - Query(findById)
- 인증없는 Open API - Query(findById)
테스트 결과
모든 요청성능(TPS 및 응답속도) 에 대해서 아래 순위를 보인다. (20~30% 웹플럭스가 성능이 좋음)
1위) 웹플럭스 + 리엑티브 몽고 2위) 웹플러스 + 블락 몽고 3위) Spring MVC + 블락 몽고
2) 조회시 쿼리 종류별 성능비교
- 기본 쿼리 ( findById )
- 커스톰 쿼리 ( findByUserId)
기본 ID 조회 쿼리가 10%정도 TPS 및 응답속도가 좋음
3) 저장 요청성능 측정
- 인증 API ( JWT 토큰 인증) - Query(save with userId)
- 인증없는 Open API - Query(save)
조회와 마찬가지로, Webflux가 우위를 보임 (1,480 요청시 MM > WM 인 결과가 보이지만 테스트시 오차로 생각됨)
4) 외부 API 호출 비교
RestTemplate 와 Webclient 성능 비교
웹플럭스 + 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를 쓰더라도 )
- 성능향상을 보기 위해 비교적 코딩복잡도가 있는 웹플럭스를 도입할지는 선택의 몫이다.