web/SpringBoot

[SpringBoot] 다중 유저 요청처리

뽀리님 2023. 12. 15. 15:01

Spring Boot를 쓰다보면 다중유저가 요청이 왔을 경우 어떻게 처리하는지는 명확하게 모른다.

 

MVC는 스프링부트를 사용하는 개발자가 직접 구현해야하는 부분이고, 다중요청처리는 스프링부트가 알아서 해주고 있는 부분이니 상대적으로 관심이 없을꺼라 생각한다.

 

사실 스프링부트가 다중요청을 처리하는 것이 아니라, 스프링부트에 내장되어있는 서블릿 컨테이너(Tomcat)에서 다중요청을 처리해준다. (서블릿 컨테이너에 대해 잘 모르신다면 서블릿 컨테이너 키워드로 검색)

 

핵심 키워드는 Tomcat Thread Pool, NIO Connector, Embeded Tomcat 이다.

 

 

처리순서

1.   스프링부트는 내장 서블릿 컨테이너인 Tomcat을 이용한다.

2.  Tomcat은 다중 요청을 처리하기 위해서, 부팅할 때 스레드의 컬렉션인 Thread Pool을 생성한다.
3.  유저 요청(HttpServletRequest)가 들어오면 Thread Pool에서 하나씩 Thread를 할당한다. 
    해당 Thread에서 스프링부트에서 작성한 Dispatcher Servlet을 거쳐 유저 요청을 처리한다..
4. 작업을 모두 수행하고 나면 스레드는 스레드풀로 반환

 

 

참조 https://velog.io/@sihyung92/how-does-springboot-handle-multiple-requests

 

작업이 들어오면core size만큼의 스레드를 생성

스레드를 미리 만들어놓고 필요한 작업에 할당했다가 돌려 받는다.

( 스레드 최대 사이즈  도달하고 작업큐도 차게 되면, 추가 요청에 대해선 connection-refused 오류를 반환 )

최대 쓰레드 크기는 코어의 개수에 맞게 설정할 있습니다. 일반적으로는 코어의 2 정도로 설정하는 경우가 많다.

 

큐 사이즈나 쓰레드 풀의 사이즈 경우 application.yml (.properties) 에서 설정할수 있다.

# 작업 큐 크기를 쓰레드풀의 최대 크기에 맞춤
server.tomcat.max-threads=200
server.tomcat.accept-count=100
server.tomcat.max-connections=10000
server.tomcat.max-http-form-post-size=2MB
server.tomcat.max-http-post-size=2MB
server.tomcat.max-http-header-size=8KB

 

 

BIO Connector / NIO Connector

참조 https://velog.io/@cjh8746/%EC%95%84%ED%8C%8C%EC%B9%98-%ED%86%B0%EC%BA%A3%EC%9D%98-NIO-Connector-%EC%99%80-BIO-Connector%EC%97%90-%EB%8C%80%ED%95%B4-%EC%95%8C%EC%95%84%EB%B3%B4%EC%9E%90

 

 

BIO 방식은 한 번의 커넥션 당 하나의 worker 쓰레드가 생성되고 이를 처리한다.

하지만 NIO 방식은 하나의 worker 쓰레드가 다중 연결을 처리할 있다.

 

저 커넥터 프로그램안에 이벤트 큐(채널)이 따로 있다. 그걸 Poller 라는 놈이 소비함

Acceptor event Queue producer, Poller thread event Queue consumer인것이다.

 

 

 

너무 어렵다... NIO도 결국 비동기에 넌블로킹인거같은데

이벤트루프 방식이고 이벤트 큐를 둬서 비동기 작업을 처리한후 등록된 콜백을 실행하여 다음 작업을 수행하는거 같다.

 

참조

https://velog.io/@cjh8746/%EC%95%84%ED%8C%8C%EC%B9%98-%ED%86%B0%EC%BA%A3%EC%9D%98-NIO-Connector-%EC%99%80-BIO-Connector%EC%97%90-%EB%8C%80%ED%95%B4-%EC%95%8C%EC%95%84%EB%B3%B4%EC%9E%90

https://giron.tistory.com/155

https://velog.io/@sihyung92/how-does-springboot-handle-multiple-requests