서블릿을 호출하는건 도데체 누구?
기본적인 요청과 응답의 과정이다. 그림에 보이는 연결이 되고 서블릿을 호출하는 과정에서 도데체 누가 Servlet 을 호출하는것일까? 그것이 바로 쓰레드라는 녀석이다.
쓰레드의 역할
- 애플리케이션 코드를 하나하나 순차적으로 실행하는것이 쓰레드이다
- 자바 Main 메서드를 처음 실행하면 main이라는 이름의 쓰레드가 실행된다
- 쓰레드가 없다면 자바 애플리케이션 실행이 불가능하다
- 쓰레드는 한번에 하나의 코드 라인만이 수행 할 수있다
- "동시 처리"가 필요하다면 쓰레드를 추가로 생성한다.
단일 요청과 다중 요청("동시 처리")
▶ 단일 요청
단 한개의 요청만 생기고 쓰레드를 할당하여 서블릿을 호출하고 응답한다. 이는 굉장히 알기 쉬운 예제라고 생각한다.
▶ 다중 요청
우리는 서비스를 제작할때 단일 요청만을 처리하지 않는다. 때문에 무조건적으로 다중 요청을 고민해야한다. 그렇다면 하나의 쓰레드가 저렇게 요청을 처리하고 있는데 밑에 있는 요청이 쓰레드를 요청하는 순간 오류가 발생한다.
해결 방법은 뭘까?
간단하다. 쓰레드를 하나 더 늘려주면 되는 것이다. 그리고 작업이 처리되면 작업을 완료한 쓰레드를 날리는 식으로 작업하더라도 아무런 문제없이 여러개의 요청을 처리해줄수 있는것이다. 물론 좋은 작업이라 말할수는 없지만 그저 간단하게 해결할 수 있다는 말을 전달하고 싶었다.
▶ 요청마다 쓰레드를 생성하는것의 장단점은 뭘까?
- 장점
- 동시 요청을 보다 깔끔하게 처리할 수 있다.
- 리소스(CPU, 메모리) 가 허용할 때 까지 처리가 가능하다
- 하나의 쓰레드가 지연되어도, 나머지 쓰레드는 정상 동작을 한다.
- 단점
- 쓰레드의 생성 비용은 만만치 않다
- 고객의 요청이 올 때 마다 쓰레드를 생성하는것은 요청을 처리할 수는 있어도 응답속도를 보장 할 수 없다
- 쓰레드는 컨텍스트 스위치 비용이 발생한다
- 쓰레드 생성에 제한을 두지 않아 너무 많은 쓰레드 생성시 CPU, 메모리가 임계점을 지나 서버가 죽어버릴수 있다
- 쓰레드의 생성 비용은 만만치 않다
▶ 쓰레드의 단점을 커버하는 쓰레드 수영장 "쓰레드풀"
위에서 말한것 중에 가장 걱정되고 위험한게 바로 서버가 죽어버리는 것이다. 즉, 쓰레드의 생성 갯수에 제한을 두지 않아서 발생하는 것인데 이를 방지하기 위해 쓰레드 풀이라는것이 생겨난것이다
- 특징
- 필요한 쓰레드를 쓰레드 풀에 보관하고 관리한다
- 쓰레드 풀에 생성 가능한 쓰레드의 최대치를 관리한다. 톰캣은 최대 200개를 기본으로 설정해준다 물론 변경 또한 가능하다
- 사용
- 쓰레드가 필요하면, 이미 생성되어 있는 쓰레드를 쓰레드 풀에서 꺼내어 사용하고 사용이 끝나면 다시 반납한다
- 만약 쓰레드 풀 안의 모든 쓰레드가 사용중이라면 기다리는 요청을 거절하거나 특정 숫자만큼 대기하도록 설정
- 장점
- 쓰레드가 미리 생성되어 있으므로, 쓰레드를 생성하고 종료하는 비용이 절약되고, 응답 시간이 매우 빠르다.
- 생성 가능한 쓰레드의 최대치가 있으므로 너무 많은 요청이 들어와도 기존 요청은 안전하게 처리할 수 있다.
- 팁!
- WAS의 주요 튜닝 포인트는 최대 쓰레드의 갯수 이다.
- 요청이 많을시 갯수가 적다면 ? 리소스는 여유롭지만 응답이 지연되는 상황이 빈번하게 나타날것이다
- 요청이 많을시 갯수가 많으면 ? CPU, 메모리 리소스 임계점 초과로 서버가 다운
- 장애 발생시에는
- 클라우드의 입장에선 서버를 증설하고, 이후에 튜닝을 작업한다
- 클라우드가 아니라면 그저 열심히 튜닝하는수밖에...
- 내 서비스에 쓰레드 적정 숫자는?
- 애플리케이션 로직의 복잡도, CPU, 메모리, IO리소스 상황에 따라 모두 다르다
- 성능 테스트
- 최대한 실제 서비스와 유사하게 성능 테스트를 시도해봐야한다
- 성능 테스트 도구 : 아파치, 제이미터, nGrinder
위의 내용의 핵심은 결국 WAS의 멀티 쓰레드 지원기능
- 개발을 해보면 알겠지만 우리는 이토록 멀티쓰레드에 대한 골머리를 썩혀본적이 없다 왜냐하면 멀티 쓰레드에 대한 부분은 WAS가 처리해주기 때문이다.
- 때문에 개발자는 마치 싱글 쓰레드를 다루듯이 프로그래밍을 할 수 있는 것이다. 하지만 우린 멀티 쓰레드환경이라는 것을 잊어서는 안된다 즉, 싱글톤 객체(서블릿, 스프링 빈)는 신경을 써주어야 한다
'Spring > 🌲 Spring' 카테고리의 다른 글
🌲 RestController 와 Controller 의 차이 (0) | 2023.08.03 |
---|---|
🌲 Request 와 Response (0) | 2023.08.03 |
🌲 개발자가 서비스를 주고 받을 때 고민하는 3가지(feat. SSR, CSR) (0) | 2023.08.01 |
🌲 서블릿(Servlet) (0) | 2023.08.01 |
🌲 웹서버 와 웹 애플리케이션 서버(WAS) (0) | 2023.08.01 |