DevBoi

[WebFlux] Webflux 관련 머리속 정리 본문

Develop/[WebFlux]

[WebFlux] Webflux 관련 머리속 정리

HiSmith 2023. 8. 7. 01:19
반응형

가끔 깜빡깜빡하다가 아차차..하던것들

 

Spring Mvc

Spring Mvc는 Thread per Request이다.

쓰레드풀의 하나의 쓰레드를 리퀘스트에 쓰는 것이다.

 

쓰레드 하나가 모든일을 사용하고, 중간에 이 과정은 block된다.

시스템 부하가 크다면, 단순히 외부 network IO를 처리하는 것 자체에 서버 속도 처리 spec이 달라진다는 것이 문제이다.

Webflux는 netty 기반이고, nginx와 동일하게, 이벤트 루프를 사용하여, 쓰레드를 사용한다.

단적인 예는 위의 그림과 같다.

하나의 쓰레드에서 외부 Api를 호출하고, 이 과정이 끝나면 다음 테스크에서는

이벤트 루프의 응답을 받은 쓰레드에서 이어서 처리를 한다.

 

높은 처리가 가능한 이유는, 각 쓰레드당 free한 쓰레드가 많아진다.

아래는 두가지 방식에 따른 쓰레드 리소스 상태이다.

 

 

Webflux를 쓰면서, 주로 지양해야하는 메소드나 기술들은 아래와 같다.

 

1.map()을 사용 지양

map 보다 flatmap을 사용하자. 

map은 동기식 펑션이라서, 해당 메소드를 사용하게 되면, 동기처리를 하게 되어 블락 된다.

 

2. 너무 많은 map은 지양하는것이 좋다. map 연산 마다 객체를 생성하기 떄문에

gc의 대상이 된다.

 

3.log는 제거

로깅도 결국 동기식으로 로깅 내용을 저장해야하기 떄문에 blocking i/o 를 발생시킨다

트래픽이 몰리면, 결국 문제가 된다. RollingFileAppender를 사용하자

 

 

 

Webflux 를 시스템에 사용할 때 사용하면 좋은 라이브러리

1.Blocking Houd

block 요소를 검사해줌

 

2.lettuce 설정

redis 관련 라이브러리 인데, 성능 튜닝이 조금 필요함

connection validation 시 동기로 동작, command를 날릴때마다 Ping command 를 동기로 동작한다

다른 포스팅에서 자세히 다루겠지만, lettuce를 사용하는

redisconnectionfactory.setValidation를 true로 설정하면, 해당 Command는 실행전에 validation이 동작하게 되고

이는 결국 동기식으로 동작하게 된다.

 

3.Reactor meltdown

이벤트 루프 쓰레드들이 blocking api때문에, Reactor 시스템이 Hang 이 걸린다.

Blocking APi를 위한 별도의 Thread Pool로 격리 시켜야한다.

subcribeOn,publishOn 이 두개는 별도 쓰레드 풀에서 동작하게 된다.

즉, 동기식 api가 필요하면, 별도의 쓰레드풀을 사용하는 것이 전체 시스템이 Hang걸리는 meltdown을 피할 수 있다.

 

반응형