[트래픽 핸들링] Spring WebFlux(feat. I/O model, Thread)
[트래픽 핸들링] Spring WebFlux(feat. I/O model, Thread)
대량의 트래픽이 몰려 서버에 부하가 걸리는 상황을 방지하기위한 여러가지 방법이 존재한다.
프록시 캐시서버, CDN , 스케일 업, 스케일 아웃 등등
오늘은 트래픽을 효율적으로 관리할수있도록 해주는 Spring WebFlux를 정리해볼것이다.
''Spring WebFlux를 이용한 Boot2 ''와 ''Spring MVC를 이용한 Boot1''을 비교한 그래프이다.
해당 그래프에서는 두 가지 특징을 볼 수 있다.
- 유저가 적을 때에는 성능에 별반 차이가 없다.
- 유저가 늘어나면 늘어날수록 극명한 성능 차이를 보여주고 있다. 어떻게 이런 차이가 일어날 수 있을까?
Spring WebFlux가 무엇이길래 이런 대용량 트래픽 상황에서 높은 성능을 보여줄까?
우리가 보통 사용하던 Spring MVC + RDBMS 패턴은 Blocking IO 방식이다. Blocking IO 방식이라는 것은 요청을 처리하기 전까지는 다른 작업을 수행할 수 없는 상태라는 것을 말한다.
동시에 여러 요청을 처리하기 위해서는 Thread 수를 늘려서 하는 방법이 존재하지만 Thread를 무지성으로 생성했다간 오버헤드가 발생할것이다.
이를 개선하기 위해 나온 기술이 Non-Blocking IO 방식인 Spring WebFlux 이다.
dependency 추가 만으로 간편하게 적용할수있다.
- spring-boot-starter-webflux dependency
효율적으로 IO를 관리하므로 트래픽이 많거나 MSA로 구축을 해야 하는 경우에는 Spring WebFlux를 도입하면 좋을것이다.
- 하지만 순차적으로 처리되는 방식이 아니라 디버깅이 힘들고 개발이 어렵다.
- 프로젝트에 당장 적용을 하기에는 공부가 많이 필요하다.
Spring WebFlux!
핵심만 말하자면 Spring WebFlux는 Asynchronous Non-blocking I/O을 이용해서 적은 수의 Thread로도 다수의 트래픽을 효율적으로 핸들링 할수있도록 한다.
동시성을 보장하기때문에 가능하다.
여기서 두가지 의문점이 생긴다.
Asynchronous Non-blocking I/O 가 뭘까?
https://onlyforus-blog.tistory.com/179
[트래픽 핸들링] Blocking, Non-blocking, Sync, Async I/O가 뭘까?(Feat. IBM 논란)
[트래픽 핸들링] Blocking, Non-blocking, Sync, Async I/O가 뭘까?(Feat. IBM 논란) 프로젝트가 배포단계에 들어서면서 다음 단계로 시야를 돌려야 할 타이밍이 왔다. 운영단계를 공부할 때가 온것같다. 그래
onlyforus-blog.tistory.com
Thread는 어떻게 유저들로부터 오는 요청을 수행할까?
해당 게시물들을 이해하면 Spring WebFlux의 설계구조가 이해가 갈것이다.
정리
이밴트나 평소 트래픽이 많은 서비스는 Spring WebFlux를 도입하면 좋을것이다.
Spring MVC나 Spring WebFlux 둘 다 성능이 동일한 구간이 있다. 서버의 성능이 좋으면 좋아질수록 해당 구간은 더 늘어날 것이다.
그렇기에 만약 여러분의 환경이 해당 구간이라면 굳이 사용할 필요가 없다.
Reference
Spring WebFlux는 무엇인가? 사용법은 어떻게 되나? (tistory.com)
[Spring WebFlux는 어떻게 적은 리소스로 많은 트래픽을 감당할까? (tistory.com)