개발자 준비/트래픽 핸들링

[트래픽 핸들링] Spring WebFlux(feat. I/O model, Thread)

osul_world 2022. 3. 16. 15:09
728x90

[트래픽 핸들링] 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 WebFluxAsynchronous Non-blocking I/O을 이용해서 적은 수의 Thread로도 다수의 트래픽을 효율적으로 핸들링 할수있도록 한다.

동시성을 보장하기때문에 가능하다.

 

 

여기서 두가지 의문점이 생긴다.

Asynchronous Non-blocking I/O 가 뭘까?

Thread는 어떻게 유저들로부터 오는 요청을 수행할까?

 

 

해당 게시물들을 이해하면 Spring WebFlux의 설계구조가 이해가 갈것이다.

 

정리


이밴트나 평소 트래픽이 많은 서비스는 Spring WebFlux를 도입하면 좋을것이다.

Spring MVC나 Spring WebFlux 둘 다 성능이 동일한 구간이 있다. 서버의 성능이 좋으면 좋아질수록 해당 구간은 더 늘어날 것이다.

그렇기에 만약 여러분의 환경이 해당 구간이라면 굳이 사용할 필요가 없다.

 

 

Reference


Spring WebFlux는 무엇인가? 사용법은 어떻게 되나? (tistory.com)

[Spring WebFlux는 어떻게 적은 리소스로 많은 트래픽을 감당할까? (tistory.com)

728x90