클라이언트와 서버(WAS) 간에 HTTP 메세지를 통해 요청과 응답을 주고 받는다.
클라이언트가 서버에 HTTP 요청을 해서 커넥션이 연결되고, WAS는 Serlvet(서블릿)을 호출해서 응답 메세지를 작성한다.
여기서 서블릿을 누가 어떻게 호출을 할까?
쓰레드(Threads)
- 어플리케이션 코드를 하나하나 순차적으로 실행하는 것이 쓰레드이다.
- 자바 메인 메서드를 처음 실행하면 main이라는 이름의 쓰레드가 실행되는 것
- 쓰레드가 없다면 자바 어플리케이션 실행이 불가능하다.
- 쓰레드는 한번에 하나의 코드 라인만 수행한다.
- 만일, 동시 처리가 필요하다면 쓰레드를 추가로 생성한다.
단일 요청 - 쓰레드 하나 사용
요청이 하나이기 때문에, 휴식하고 있던 쓰레드를 해당 요청에 할당해서 Servlet을 통해 HTTP 응답하게 된다.
다중 요청 - 쓰레드 하나 사용
요청이 여럿 있는 반면에, 쓰레드가 하나라면 위의 그림과 같이 요청들이 쓰레드를 대기하게 되면서 처리 지연이 발생한다.
또한, 다른 요청때문에 기존에 처리중인 요청도 제대로 요청할 수 없는 상황이 발생하기도 한다.
이 문제점을 없애기 위해선 어떻게 해야할까?
다중 요청 - 요청 마다 쓰레드 생성
위의 처리 지연 문제를 해결하기 위해, 요청이 올때마다 쓰레드를 새로 생성해서 할당하는 방식이다.
→ 요청마다 쓰레드를 생성하게 되면 얻는 장점과 단점이 나뉜다.
장점
- 동시 요청을 처리할 수 있다.
- 리소스(CPU, 메모리)가 허용할 때까지 처리 가능
- 하나의 쓰레드가 지연 되어도, 나머지는 정상 작동
단점
- 쓰레드의 생성 비용이 매우 비쌈
- 요청이 올 때마다 쓰레드를 생성하면, 응답 속도가 늦어진다.
- 쓰레드는 컨텍스트 스위칭(Context Switching) 비용이 발생
- 쓰레드 생성에 제한이 없다. → 요청이 너무너무 많으면, CPU, 메모리 임계점을 넘어서 서버가 죽을 수 있음
[ 컨텍스트 스위칭 비용은 쉽게 말하자면, 어떤 쓰레드에서 다른 쓰레드로 할당이 바뀌면서 생기는 비용을 말한다. ]
그렇다면 이 단점들을 보완하는 방법은 없을까?
쓰레드 풀(Threads pool)
→ 쓰레드 풀을 통해서 요청마다 쓰레드를 생성하는 방식의 단점을 보완할 수 있다.
쓰레드 풀은 말 그대로 쓰레드를 미리 설정한 개수만큼 생성해둔 뒤, 쓰레드 풀에 담아놓는다.
그러면, 사용자로부터 요청이 오면 쓰레드 풀에서 쓰레드를 꺼내서 요청에 할당하게 된다.
사용을 종료하면 쓰레드 풀에 해당 쓰레드를 반납한다.
해당 쓰레드 풀에 있었던 쓰레드가 전부 다른 요청에 할당되어 있어 실행 중이면, 이후의 요청은 쓰레드 대기를 하거나 거절 신호를 보낸다.
기다리는 요청은 특정 숫자만큼만 대기하도록 설정할 수 있다.
→ 예를 들어, 쓰레드 전부 할당 뒤 100명만 대기하도록 설정하면 101번째 요청부터는 거절된다.
특징 및 장점
- 쓰레드 풀에 생성 가능한 쓰레드의 최대치를 관리한다. ( 톰캣은 200개가 기본 설정 )
- 쓰레드가 미리 생성되어 있으므로, 쓰레드를 생성하고 종료하는 비용이 절약, 응답 시간이 빠름
- 생성 가능한 쓰레드의 최대치가 있으므로, 많은 요청이 와도 기존 요청은 안전하게 처리할 수 있다.
정리
WAS의 주요 튜닝 포인트는 최대 쓰레드(Max Thread)의 수이다.
이 값을 잘 설정해야 문제가 발생하지 않는다.
쓰레드 풀의 적정 숫자를 찾기 위해선 성능 테스트 등을 통해서 상황에 맞춰서 설정해야 한다.
멀티 쓰레드에 대한 부분은 WAS가 처리한다.
개발자는 멀티 쓰레드 관련 코드를 신경쓰지 않아도 된다. → 개발자는 마치 싱글 쓰레드를 프로그래밍 하듯이 소스 개발
다음시간에는, CSR(클라이언트 사이드 렌더링), SSR(서버 사이드 렌더링)에 대해서 알아보겠다.
'Web' 카테고리의 다른 글
CSR(Client Side Rendering), SSR(Server Side Rendering) (0) | 2023.08.04 |
---|---|
서블릿(Servlet), 서블릿 컨테이너(Servlet Container) (0) | 2023.08.04 |
웹 시스템 구성( Web Server, WAS ) (0) | 2023.08.04 |
internet-network(IP, TCP, UDP, PORT, DNS) (0) | 2023.06.23 |