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

원글 페이지 : 바로가기

😁 쓰레드란? 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

답글 남기기

이메일 주소는 공개되지 않습니다. 필수 필드는 *로 표시됩니다