본문 바로가기
개발관련

Webflux vs WebMvc 성능 비교

by 부발자 2020. 4. 6.

Webflux 가 성능이 좋다고 하는데, 얼마나 성능이 좋은지 알아보도록 하자.

 

Webflux는 비동기 논 블록킹 방식이므로 Webmvc의 멀티 스레드 방식보다 성능이 우수하다. 적은 리소스로 더 많은 트래픽을 처리가 가능하다.

여기서 좀 헷갈리는 내용을 정리하고 넘어가자

 

동기-비동기, 블록킹-논블록킹의 차이점은 과연 무엇인가?

동기와 비동기 = 함수가 바로 리턴되는지 여부
블록킹과 논블록킹 = 백그라운드 작업 여부를 확인하는가 여부

동기-블록킹 방식은 함수를 호출하면 백그라운드 작업이 완료되었는 계속 확인하고 완료되면 함수가 리턴되는 구조이고
비동기-논 블록킹 방식은 함수를 호출하고 백그라운드 작업이 끝났는지 확인하지 않고 리턴을 하고 바로 다른 작업을 한다. 백그라운드 작업의 종료 여부는 이벤트로 수신한다. Webflux는 비동기-논블록킹 방식이다

 

그럼 실제로 테스트를 진행해 보자.

 

테스트 서버 환경

  • 컴퓨팅 : AWS t2.large (CPU: 2, Memory: 8G)
  • 저장소 : Aurora (Mysql 5.7), Elastic Cache (Redis 5.0.3)
  • 성능 테스트 툴 : Jmeter (Thread : 500 * Count : 500)

먼저 Redis 의 read 성능을 확인해 보았다.

 

[Webflux] Redis Read

Samples Average Min Max Error Throughput CPU(max)
250,000 149ms 2ms 1440ms 0.00% 3134/sec 94%
250,000 149ms 2ms 1174ms 0.00% 3153.1/sec 98%
250,000 150ms 2ms 1305ms 0.00% 3118.1/sec 97%

 

[Webmvc] Redis Read

Samples Average Min Max Error Throughput CPU(max)
250,000 327ms 3ms 1561ms 0.00% 1481.0/sec 97%
250,000 327ms 3ms 1419ms 0.00% 1480.0/sec 98%
250,000 328ms 3ms 1506ms 0.00% 1477.2/sec 98%

 

Average와, Throughput을 보면 Webflux가 Webmvc 보다 2배 조금 넘는 성능이 나왔다.

 

 

다음은 Mysql 의 read 성능을 확인해 보았다.

 

여기서 Mysql 은 R2DBC를 사용하지 않았고, Reactor 문서에서 나와 있는대로, Mono.fromCallable 을 사용하여 Scheduler의 elastic 스레드에서 처리하도록 해 놓았다.

Mono blockingWrapper = Mono.fromCallable(() -> { 
    return /* make a remote synchronous call */ 
});
blockingWrapper = blockingWrapper.subscribeOn(Schedulers.boundedElastic()); 

 

[Webflux] Mysql Read

Samples Average Min Max Error Throughput CPU(max)
250,000 291ms 4ms 2087ms 0.00% 1650.0/sec 97%
250,000 292ms 2ms 2034ms 0.00% 1644.7/sec 95%
250,000 291ms 4ms 2335ms 0.00% 1648.2/sec 98%

 

[Webmvc] Mysql Read

Samples Average Min Max Error Throughput CPU(max)
250,000 339ms 2ms 5523ms 0.00% 1411.0/sec 50%
250,000 337ms 4ms 4285ms 0.00% 1425.0/sec 52%
250,000 330ms 4ms 4208ms 0.00% 1456.2/sec 52%

 

Average와, Throughput을 보면 Webflux가 Webmvc 조금 성능이 좋게 나오긴 하였는데, 큰 차이는 없는 것 같다.

그러나 웹플럭스를 사용할때 동기 블록킹을 처리하는 대안으로는 적당한것 같다.

 

RDB 를 비동기 논블록킹으로 처리를 제대로 하려면 R2DBC 를 사용해야 할것 같긴 하다. (R2DBC 정식 버전이 나온지 얼마 안됨)

R2DBC를 사용하였을때 성능이 어떻게 되는지 궁금하긴 하다. 곧 테스트해서 올리도록 하겠다.

반응형

'개발관련' 카테고리의 다른 글

MSA 분산 트랜잭션  (0) 2020.04.27
Optimistic Lock과 Pessimistic Lock  (0) 2020.04.15
Spring Webflux Cold / Hot 이해하기  (0) 2020.03.29
Spring Webflux, 이해하고 사용하자  (0) 2020.03.21
Spring Boot & HikariCP 튜닝  (0) 2020.03.15