Spring/mvc

[Spring MVC 1] - 동시 요청 - 멀티 쓰레드

dev_rosieposie 2022. 7. 28. 00:13

서블릿을 호출하는 주체

웹 브라우저(클라이언트)에서 서버에 요청을 하면,  tcp/ip 커넥션 연결이 되고 서블릿을 호출해주고 was서버는 응답을 해준다.

그런데, 서블릿을 호출하는 주체는 누구인가?

 

바로 바로 쓰레드...!!

 

쓰레드란?

  • 어플리케이션 코드를 하나하나 순차적으로 실행하는 것은 쓰레드
  • 자바 메인 메서드를 처음 실행시  main이라는 쓰레드가 실행
  • 쓰레드가 없다면 자바 어플리케이션 실행이 불가능
  • 쓰레드는 한번에 하나의 코드 라인만 실행
  • 동시 처리가 필요하면 쓰레드를 추가로 생성

 

단일 요청 - 쓰레드 하나 사용시 

 

단일 요청시에는 큰 문제는 없어보인다. 

다중 요청 - 쓰레드 하나 사용시 

문제는 다중 요청! 쓰레드를 하나만 사용한다고 했을 때 request1이 처리되는 동안 request2는 대기중인 상태로 그마저도 처리가 지연되면 둘다 클라이언트 요청은 실패하게 된다

요청마다 신규 쓰레드 생성

장점 단점
동시 요청을 할 수 있다 쓰레드는 생성 비용이 매우 비싸다 
(고객의 요청이 올 때마다 쓰레드를 생성하면, 응답속도 느려짐)
리소스(CPU, 메모리)가 허용할 때 까지 처리가능 쓰레드는 컨텍스트 스위칭 비용이 발생
하나의 쓰레드가 지연 되어도 나머지 쓰레드는 정상 동작한다 쓰레드 생성에 제한이 없다
(고객 요청이 많이 오면  cpu, 메모리 임계점을 넘어 서버가 죽을 수 있음)

 

이 점을 해결하기 위해 was에는 쓰레드 풀이 존재한다.

쓰레드 풀

마치 수영장(쓰레드 풀)에 놀고 있는 쓰레드에게 요청이 들어오면 실행을 하게하고, 실행가능한 쓰레드가 없을 때는 얼마나 더 요청을 받고 대기시킬 것인지 설정을 할 수 도 있다!!! ---> tomcat max connection

 

  •  특징
    • 필요한 쓰레드를 쓰레드 풀에 보관하고 관리한다
    • 쓰레드 풀에 생성 가능한 쓰레드의 최대치를 관리한다. 톰캣은 최대 200개 기본 설정(변경 가능)
  • 사용
    • 쓰레드가 필요하면, 이미 생성되어 있는 쓰레드를 쓰레드 풀에서 꺼내서 사용한다.
    • 사용을 종료하면 쓰레드 풀에 해당하는 쓰레드를 반납한다.
    • 최대 쓰레드가 모두 사용중이어서 쓰레드 풀에 쓰레드가 없다면 기다리는 요청은 거절하거나 특정 숫자만큼 대기하도록 설정 가능하다.
  • 장점
    • 쓰레드가 미리 생성되어 있으믄로 쓰레드를 생성하고 종료하는 비용 (cpu)이 절약되고, 응답 시간이 빠르다
    • 생성 가능한 쓰레드의 최대치가 있으므로 너무 많은 요청이 들어와도 기존 요청은 안전하게 처리 할 수 있다

was 의 멀티 쓰레드 지원

  • 멀티 쓰레드에 대한 부분은 was가 처리
  • 개발자가 멀티 쓰레드 관련 코드를 신경쓰지 않아도 되고, 마치 싱글 쓰레드 프로그래밍 하듯 편하게 개발
  • 멀티 쓰레드 환경이므로 싱클톤 객체(서블릿, 스프링 빈)은 주의해서 사용

 


와우 다중처리는 내부에서 이렇게 처리되는구나 톰캣은 생각보다 더 위대한 것이었다

어떻게 쓰레드풀을 만들 생각을 했을까 !...  와우....                                         

 

                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                     @ 스프링 MVC 1편 - 백엔드 웹개발 by 김영한을 참조하고 있습니다.