반응형
- 클라이언트에서 서브를 요청하면 WAS가 응답을 하는 게 보통이다.
- 서블릿은 누가 호출하지? 쓰레드가 호출한다.
- 쓰레드란?
- 애플리케이션 코드를 순차적으로 실행한다.
- 쓰레드가 없다면 자바 애플리케이션 실행이 불가능하다.
- 자바에서는 메인 메서드를 실행하게 되면 main이라는 이름의 쓰레드가 실행하게 된다.
- 쓰레드는 한 번에 하나의 코드 라인만 수행한다.
- 동시 처리에 경우 필요에 따라 쓰레드를 추가 생성한다.
- 단일 요청 : 쓰레드를 하나만 사용한다.
- 요청이 들어온다. → WAS에서 쓰레드를 할당한다. → 쓰레드는 서블릿을 호출한다. → 서블릿이 요청에 응답한다.
- 위와 같은 원리로 움직이지만 만약 쓰레드 요청이 여러개 들어왔을 경우를 보자.
- 요청이 들어왔고 쓰레드를 할당 받아서 서블릿을 호출하고 있는데 어떤 이유로 호출 처리가 지연되고 있다. 그 와중에 새로운 요청이 들어오면 새로운 요청은 아직 일 중인 쓰레드가 신경써주지 못 하기 때문에 대기하게 되고 이러다 둘 다 오류가 떠버리는 상황이 생기게 된다.
- 이런 문제를 해결하기 위해 요청마다 쓰레드를 생성하게 된다.
- 요청 마다 쓰레드 생성 : 요청에 맞춰 쓰레드를 생성해 준다.
- 리소스(CPU, 메모리)가 허용될 때 까지 처리가 가능하고 하나의 쓰레드가 지연이 된다고 해도 나머지 쓰레드는 정상 동작하니 동시 요청을 처리할 수 있게 된다.
- 하지만, 쓰레드 생성 비용은 매우 비싸고 요청마다 쓰레드를 생성하게 되면 응답 속도가 늦어지게 된다. 그리고 쓰레드 생성에 제한이 없기 때문에 요청이 급격하게 많아지면 리소스가 임계점을 넘어서 서버가 다운될 수가 있다.
- 이런 문제를 해결하기 위해 쓰레드 풀이란 개념이 있다.
- 쓰레드 풀 : 쓰레드를 미리 생성하여 모아두는 방식이다.
- 쓰레드 풀에 쓰레드를 미리 생성해 두고 요청이 들어오면 쓰레드 풀에서 꺼내어 할당해 준다.
- 쓰레드가 다 사용되고 나면 다시 쓰레드 풀로 쓰레드를 반납해서 재활용할 수 있다.
- 요청이 들어왔을 때 만약, 쓰레드 풀에 쓰레드가 없다면 대기하거나 거절할 수가 있다.
- 특징
- 쓰레드 풀에 보관, 관리한다.
- 쓰레드 풀에 생성 가능한 쓰레드 최대치를 관리하는데 톰캣은 최대 200개가 기본 설정이다.(변경이 가능하다.)
- 장점
- 쓰레드가 미리 생성되어 있기 때문에 쓰레드를 생성하고 종료하는 비용(CPU)이 절약이 된다. 또, 응답 시간 또한 빠르다.
- 생성 가능한 쓰레드의 최대치가 있기 때문에 많은 요청이 들어와도 기존 요청은 안전하게 처리가 가능하다.
- 실무 팁
- WAS의 주요 튜닝 포인트는 최대 쓰레드, Max Thread 수 이다.
- 값이 낮다면 → 동시 요청이 많으면 서버 리소스는 여유롭다. 하지만 클라이언트는 금방 응답 지연이 될 것이다.
- 값이 높다면 → 동시 요청이 많으면 CPU, 메모리 리소스 임계점 초과로 서버가 다운된다.
- 장애가 생기면 → 클라우드면 서버를 늘리고 후에 튜닝한다. 클라우드가 아니라면 열심히 튜닝하면 된다고 한다.
- 쓰레드 풀 : 적정 숫자
- 로직 복잡도, CPU, 메모리, IO 리소스 상황에 따라 모두 다르다.
- WAS의 멀티 쓰레드 지원
- 핵심
- 멀티 쓰레드는 WAS가 처리한다. → 개발자가 신경을 안 써도 된다.
- 싱글 쓰레드 프로그래밍 하듯이 개발하면 된다. → 하지만 멀티 쓰레드 환경이므로 싱글톤 객체(서블릿, 스프링 빈)는 주의해서 사용해야한다.
- 핵심
스프링 MVC 1편 - 백엔드 웹 개발 핵심 기술을 참고하여 공부한 내용입니다.
반응형
'Framework & Library > Spring Boot' 카테고리의 다른 글
[Spring Boot] : Get 쿼리 파라미터를 통해 파라미터를 조회하기 (0) | 2022.01.19 |
---|---|
[Spring Boot] : HTML, HTTP API, CSR, SSR (0) | 2022.01.18 |
[Spring Boot] : Servlet, 서블릿 (0) | 2022.01.18 |
[Spring Boot] : Web Server와 Web Application Server (0) | 2022.01.18 |
[Spring Boot] : lombok(롬복)라이브러리 추가 및 플러그인 설치하기 (0) | 2022.01.10 |
댓글