해당 글은 Maarten Smeets
가 작성한 https://technology.amis.nl/2020/04/10/spring-blocking-vs-non-blocking-r2dbc-vs-jdbc-and-webflux-vs-web-mvc/ 를 차용, 번역하여 작성한 글입니다.
Spring Reactive Programming
스프링 프레임워크 버전 5는 리액티브 프로그래밍을 위한 WebFlux를 2017년 8월에 릴리즈 하였고, 2019년 12월에 리액티브 드라이브를 사용한 관계형 데이터베이스인 R2DBC를 릴리즈하였다. 해당 포스팅에서는 WebFlux와 R2DBC를 사용했을 때 더 높은 동시성에 대해 알아보고 있다. 이 둘을 사용하면 더 빠른 응답과 더 높은 처리량을 가지며 메모리도 조금 사용하고 요청당 CPU도 조금 사용한다. 그리고 JAR 용량까지 줄어든다고 한다.
해당 포스트에서는 4가지 구현체를 여러 지표로 비교하고 있다.
- 1번 구현체 : Spring Web MVC + JDBC
- 2번 구현체 : Spring Web MVC + R2DBC
- 3번 구현체 : Spring Web Flux + JDBC
- 4번 구현체 : Spring Web Flux + R2DBC
성능 측정용 지표
- 응답시간 ( Response Time )
- 처리량 ( Throughput - Number of Requests )
- CPU 사용량 ( Based on PID Stat )
- 메모리 사용량 ( Private & Shared Process Memory )
각 지표별 그래프를 보면서 분석을 해보도록 하자 먼저 , Concurrency 별 응답시간을 측정한 그래프이다.
Latency at Different Concurrencies
기울기가 낮게 나올수록 성능이 좋다고 할 수 있는데, R2DBC
를 사용한 구현체의 경우 Web Framework 제약없이 비슷한 성능을 가지며 가장 좋게 나온다.
반면 JDBC
를 사용한 구현체는 다소 성능이 떨어지는데 WebFlux를 사용하였을 때가 낫다는 것을 볼 수 있다.
Throughput
120초 내 Request 처리능력을 측정한 결과지표이다. 역시나 R2DBC
를 사용한 구현체들이 전체적으로 월등함을 볼 수 있다. 다만 MVC + JDBC가 낮은 Concurrency(< 50, 보통 팀 내에서만 사용하는 백오피스 서비스처럼 동시접속이 많이 없는) 에서는 좋은 선택지이지만 B2C 서비스의 경우 R2DBC가 최선이라고 할 수 있다.
또 한가지 주목할 점은 ‘WebFlux + JDBC’가 다른 구현체들보다 현저히 낮은 처리능력을 보여주고 있다는 것이다. 이는 밑에서 Request 별 자원사용률과 접목해서 봐야 그 이유를 알 수 있다.
CPU
Process User와 Kernel Time 합을 구한 값이다. WebFlux + JDBC가 가장 적게 사용했다는 지표가 나오지만, 위에서 언급했듯 Request 별 자원사용률로 환산해서 봐야 그 이유를 알 수 있다.
Web MVC + JDBC는 R2DBC를 사용한 구현체들과 비슷하지만 제일 많이 사용한다는 것을 알 수 있다.
CPU per Request
자원사용률(User + Kernel Time)을 Request 처리량으로 나눈 값이다.
WebFlux + JDBC가 Request 처리에 자원을 제일 많이 소비한다는 것을 알 수 있다. 낮은 Concurrency에서도 일관되지 않고 불안정하다는 것을 보여주고 있다. 이를 통해 ~누가봐도~ WebFlux + JDBC 조합은 가장 성능이 떨어지며 불안정하다는 것을 알 수 있다.
또 하나 필자가 주목한 것은 Web MVC + JDBC가 낮은 Concurrency에서 정말 좋은 성능을 보여주고 있다는 점이다.
Memory Usage
마지막으로 Memory 사용량 또한 예상되다시피 WebFlux + R2DBC가 최선의 선택지이며 Concurrency가 낮은 범위에서는 Web MVC + JDBC가 최고로 좋은 효율을 보여주고 있다.
이러한 지표결과를 몇 줄로 요약하자면,
R2DBC + Webflux
가 높은 동시성때는 좋은 선택이지만 대략 200 concurrenct request 밑으로는 Spring Web MVC + JDBC
가 좋은 선택이다.