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 |