스프링 부트 - Thread Pool(쓰레드 풀)

salgu·2021년 12월 20일
0
  1. 스프링부트는 내장 서블릿 컨테이너인 Tomcat을 이용합니다.
  2. Tomcat은 다중 요청을 처리하기 위해서, 부팅할 때 스레드의 컬렉션인 Thread Pool을 생성합니다.
  3. 유저 요청(HttpServletRequest)가 들어오면 Thread Pool에서 하나씩 Thread를 할당합니다. 해당 Thread에서 스프링부트에서 작성한 Dispatcher Servlet을 거쳐 유저 요청을 처리합니다.
  4. 작업을 모두 수행하고 나면 스레드는 스레드풀로 반환됩니다.

톰캣 3.2 이하에선 클라이언트에서 요청이 하나 들어올때마다 Thread를 생성하고
요청이 끝나면 Destroy 했습니다.
이 방식은 OS와 JVM에 부하를 주게되고 동시다발적인 요청도 처리하지 못하였습니다.

쓰레드풀의 작동 플로우는

  1. 첫 작업이 들어오면, core size만큼의 스레드를 생성합니다.
  2. 유저 요청이 들어올 때마다 작업 큐에 담아둡니다.
  3. core size의 스레드 중, 유휴상태인 스레드가 있다면 작업 큐에서 작업을 꺼내 스레드에 작업을 할당하여 작업을 처리합니다.
    3-1. 만약 유휴상태인 스레드가 없다면, 작업은 작업 큐에서 대기합니다.
    3-2. 그 상태가 지속되어 작업 큐가 꽉 찬다면, 스레드를 새로 생성합니다.
    3-3. 3번과정을 반복하다 스레드 최대 사이즈 에 도달하고 작업큐도 꽉 차게 되면, 추가 요청에 대해선 connection-refused 오류를 반환합니다.
  4. 태스크가 완료되면 스레드는 다시 유휴상태로 돌아갑니다.
    4-1. 작업큐가 비어있고 core size이상의 스레드가 생성되어있다면 스레드를 destory합니다.

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

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

profile
https://github.com/leeeesanggyu, leeeesanggyu@gmail.com

0개의 댓글