카테고리 없음

[Servlet] 멀티 쓰레드, 하나의 서블릿이 동시 요청을 어떻게 처리할까?

ckm7907 2024. 4. 4. 09:52

😁 쓰레드란?

thread란 프로세스 내에서 실제로 작업을 수행하는 주체를 의미한다.

모든 프로세스에는 한 개 이상의 스레드가 존재하여 작업을 수행합니다.

쓰레드는 한줄씩 코드를 실행한다.

쓰레드는 멀티 태스킹에서 쓰이는 워크플로우의 최소 단위이다.

 

왜 쓰레드가 존재하는 지 그리고 쓰레드를 하나만 있을 때 문제점을 보고, 어떻게 해결할 지 함께 아래 글을 보며 생각해보자!

 

쓰레드 하나일 때를 가정하고, 단일 요청이 들어왔을 때

1. 아무런 요청이 없을 때 쓰레드는 휴식을 취하고 있다.

2. 요청이 들어오면 휴식하고 있던 쓰레드가 있으니 할당해준다. 그 이후 쓰레드는 servlet을 호출하여 코드를 실행한다.

3. 쓰레드를 할당 후 코드를 실행하고 클라이언트에 응답을 보내준다.

4. http는 비연결성이다. 즉, 응답을 보낸 후 연결이 끊긴 후 쓰레드는 휴식 상태로 돌아간다.

 

🤔 다중 요청일 때 쓰레드가 하나인 경우

다중 브라우저로부터 요청이 들어오면, WAS 는 스레드를 할당한다. 그런데 만약 서블릿 객체에서 처리 지연이 발생하면, 모든 브라우저가 죽어버린다!

각 요청마다 스레드를 생성하는 방식은 각 스레드가 독립적으로 작동하기 때문에 하나의 스레드에서 처리 지연이 발생하더라도 다른 스레드에는 영향을 미치지 않습니다.

 

요청마다 쓰레드 생성 시 장단점

😄 장점

동시 요청을 처리할 수 있다.

리소스(CPU, 메모리)가 허용할 때 까지 가능하다. (자원을 모두 활용할 수 있다.)

하나의 스레드가 지연되어도 나머지 스레드는 정상 동작한다.

😑 단점

스레드 생성 비용은 매우 비싸다.

-> 고객의 요청이 들어올 때마다 스레드를 생성하면, 응답 속도가 늦어진다.

스레드는 컨텍스트 스위칭 비용이 발생한다.

스레드 생성에 제한이 없다. 

-> 고객 요청이 너무 많을 경우, CPU와 메모리 임계점을 넘어서 서버가 죽을 수 있다.

 

요청마다 스레드 생성 단점 보안 - 스레드 풀

스레드를 생성/종료가 아닌 여러 스레드를 하나의 공간에서 미리 만들어놔서 필요할 때 빌려 쓰고 반납하는 형식으로 흘러간다.

만약 최대 스레드가 모두 사용중이어서 스레드 풀에 스레드가 없다면? 

-> 스레드를 대기/거절로 설정할 수 있다.

 

스레드 풀 장단점

😄 장점

스레드를 생성/종료하는 비용 절약 & 응답 시간이 빠르다.

생성 가능한 스레드의 최대치가 있으므로 너무 많은 요청이 들어와도 기존 요청은 안전하게 처리할 수 있다.

🙄 생각할점

스레드 풀을 너무 적게하면 리소스를 너무 적게 사용할 수 있다.

-> cpu, memory가 거의 사용하지 않는데, 서버 요청을 처리하는 수가 적으면 백엔드 개발자로서 부끄러운 일이다.

스레드 풀을 너무 많게하면 리소스의 임계점을 넘어서 서버가 죽을 수 있다.

즉,  ‘적당한’ 스레드 풀의 크기를 결정하는 것은 간단한 문제가 아니다. 이를 위해 성능 테스트와 모니터링이 필요하며, 이를 통해 시스템의 성능을 최적화할 수 있다.

 

Spring에서 Thread 흐름

 

Web Container가 쓰레드를 관리한다.

톰캣은 스레드 풀의 기본 max 갯수는 200개이다.

🎢 톰캣의 기본 설정의 흐름

1. 브라우저 요청을 보내면 톰캣은 쓰레드 풀에 휴식 쓰레드가 존재한다면, 그 쓰레드를 할당해준다.

1-1. 만약 휴식 쓰레드가 존재하지 않고, 현재 쓰레드 갯수가 200개 보다 작을 경우 쓰레드를 만든다.

1-2. 만약 휴식 쓰레드가 존재하지 않고, 현재 쓰레드 갯수가 200개라면 대기한다.

2. 쓰레드는 특정 서블릿의 service() 메소드를 실행하게 된다. 이 메소드를 HTTP 요청 메소드에 따라 doGet(), doPost() 등의 메소드를 호출한다.

3. 서블릿이 작업을 완료하면, 그 결과는 HttpServletResponse 객체에 저장된다. 이 객체는 웹 컨테이너에 의해 브라우저로 전송 된다. 웹 컨테이너는 이 응답을 HTTP 프로토콜에 맞게 포맷팅하고, 이를 클라이언트에게 전송한다.

4. 서블릿이 작업을 완료하고 응답을 보내면, 해당 스레드는 작업을 완료한 것으로 간주한다. 이 스레드는 휴식상태로 돌아가며, 다음 요청을 처리하기 위해 풀에 반환 된다.

 

출처

https://velog.io/@wlsgur1533/%EC%84%9C%EB%B8%94%EB%A6%BF%EC%9D%80-%EC%9A%94%EC%B2%AD%EB%8B%B9-%EC%8A%A4%EB%A0%88%EB%93%9C-%EB%A9%80%ED%8B%B0%EC%8A%A4%EB%A0%88%EB%94%A9%EA%B3%BC-%EC%9B%B9-%EC%95%A0%ED%94%8C%EB%A6%AC%EC%BC%80%EC%9D%B4%EC%85%98-%EA%B0%9C%EB%B0%9C

 

서블릿은 요청당 스레드: 멀티스레딩과 웹 애플리케이션

서블릿은 요청당 스레드

velog.io

https://mbc2579.tistory.com/37

 

서블릿, 동시 요청 - 멀티 쓰레드

서블릿이란? 웹 통신에서 요쳥과 응답을 처리하는 자바 객체이다. 주요 클래스로는 HttpServlet가 있다. 서블릿 특징 urlPatterns(/hello)의 URL이 호출되면서 서블릿 코드가 실행 HTTP 요청 정보를 편리하

mbc2579.tistory.com

https://velog.io/@leeseunghee00/1-%EC%9B%B9-%EC%95%A0%ED%94%8C%EB%A6%AC%EC%BC%80%EC%9D%B4%EC%85%98-%EC%9D%B4%ED%95%B4

 

웹 애플리케이션 이해

웹은 HTTP를 기반으로 동작한다.클라이언트-서버 간의 통신은 HTTP 를 기반으로 모든 동작이 이루어진다.서버-서버 간의 통신 역시 HTTP 를 사용한다.웹 서버는 HTTP 기반으로 동작하는 서버를 말한

velog.io