동시 요청 멀티 쓰레드
클라이언트에서 서버에 요청을 하면 응답이 된다.
이때 WAS 에서 Servlet 을 호출하게 되는데 쓰레드가 바로 이 역할을 맡게된다.
쓰레드는 애플리케이션 코드를 하나하나 순차적으로 실행하게 되는데 자바 메인 메서드를 처음 실행하면 main이라는 이름의 쓰레드가 실행된다.
쓰레드가 없다면 자바 애플리케이션은 실행이 불가능하며 한 번에 하나의 코드 라인만 수행 할 수 있다.
또 동시 처리가 필요하다면 쓰레드를 추가로 생성하게 된다.
하나의 쓰레드만 있다고 가정할 때 요청이 오게 되면 쓰레드가 할당 된후 요청을 보내면 된다.
다중 요청일 경우 먼저온 요청을 처리 한 후 응답을 보내고 다음 요청을 수행하면 되지만 첫 번째 요청이 지연될 경우 두번 째 요청을 실행할 수 없을 뿐더러 첫 번째 요청까지 수행이 불가능해 진다.
따라서 새로운 요청이 올 경우 신규 쓰레드를 생성해서 새로운 요청을 처리해야 한다.
요청마다 쓰레드를 생성하게 된다면 동시 요청을 쉽게 처리할 수 있고 하나의 쓰레드가 지연 되더라도 나머지 쓰레드는 정상으로 동작할 수 있다는 장점이 있다.
하지만 쓰레드는 생성 비용이 매우 비싸고 고객의 요청이 올 때마다 쓰레드를 생성하게 된다면 응답 속도가 늦어질 수 있다.
너무 많은 고객의 요청이 오게되면 cpu 메모리의 임계점을 넘어서 서버 자체가 죽을 수 있다.
이런것을 해결하기 위해서 많은 WAS 는 쓰레드 풀을 생성해서 쓰레드의 갯수를 조절한다.
일정량의 쓰레드를 미리 생성해놓고 요청이 들어 올 때 마다 쓰레드를 할당하고 반납하는 형식으로 처리한다.
쓰레드 풀안에 여분의 쓰레드가 없을 경우에는 대기하거나 요청을 거절하는 방식으로 수행한다.
쓰레드 풀을 사용하게 되면 쓰레드가 미리 생성되어 있기 때문에 쓰레드를 생성하고 종료하는 비용이 절감되고 응답 시간이 빠르다.
또한 생성 가능한 쓰레드의 최대치가 있기 때문에 너무 많은 요청이 들어와도 기존 요청은 안전하게 처리를 할 수 있다.
쓰레드 풀의 기본 실무 팁
WAS의 주요 튜닝 포인트는 최대 쓰레드(max thread)수 인데 클라우드라면 일단 서버부터 늘리고 이후에 튜닝을 하는것이 유리하고, 클라우드가 아니라면 서비스의 상황에 따라서 여러번의 튜닝을 거치면 된다.
애플리케이션 로직의 복잡도, cpu, 메모리, io리소스 상황에 따라서 모두 다르기 때문에 성능 테스트를 진행해서 최적의 숫자를 찾아야 한다.
어쨌든 이런것들은 개발자가 사실 신경써야 할 부분은 아니다.
멀티 쓰레드에 대한 부분은 WAS가 처리하기 때문에 멀티 쓰레드의 관련 코드를 신경쓰지 않아도 되고 설정만 간단하게 조작을 하면 된다.
개발자는 싱글 쓰레드 프로그래밍을 하듯 편하게 소스 코드를 작성하면 된다.
단 멀티 쓰레드 환경이기 때문에 싱글톤 객체(서블릿, 스프링 빈)는 주의해서 사용을 해야 한다.