단일 요청이 들어온 경우를 생각해보자.
쓰레드는 요청이 들어오기전에는 휴식 상태로 대기하고 있다. 이후 요청이 들어오면 휴식 상태에 있던 쓰레드가 클라이언트로 부터 받은 요청이 할당
되어 서블릿 객체를 호출하고, 로직을 실행한다.
이후 요청을 처리한 응답을 반환한다.
그럼 클라이언트로 부터 다음과 같이 다중 요청을 받을 경우 쓰레드를 하나만 사용한다면 어떻게 될까?
일반적으로 단일 요청을 처리하는 경우보다 다중 요청을 처리하는 경우가 많을 것이다.
위의 그림과 같이 클라이언트로 부터 요청 A 가 들어온 경우, 쓰레드에 요청 A가 할당 된다. 만약 쓰레드가 하나 밖에 없다면, 다른 클라이언트로 부터 다음 요청 B가 들어와도 이를 처리 할 수 있는 쓰레드가 없기 때문에.
처리가 지연 될 수 밖에 없다.
따라서 위의 그림 처럼 요청B는 요청A가 처리 될 때 까지 기다렸다가. 실행이 된다.
만약 위의 상태에서 요청C, 요청 D, 요청 E … 등 수많은 다른 요청이 들어온다면 서버의 속도가 매우 느릴 것이다.
💡 **쓰레드 하나가 하나의 요청**을 처리 할 수 밖에 없기 때문에, 당연하게도 여러 요청이 들어오면 이를 처리하기는 쉽지가 않다.만약 쓰레드가 요청 A를 처리하던 중, 요청B에 timeout이 발생하면 요청 B에 대한 처리가 안된다.
최악의 상황에는 요청A, 요청 B 둘다 timeout이 발생할 수도 있다.
그렇기 때문에 다음과 같은 방법으로 다중 요청을 처리 한다.
새로운 요청이 들어올 때마다 요청을 처리하는 신규 쓰레드를 만들어 다중 요청을 처리 할 수 있도록 한다.
다중 요청 - 요청 마다 쓰레드 생성
의 단점은 운영중인 서비스에 치명적이다. 서버가 한번 죽으면 이를 복구하는데에도 시간이 들어가기 때문이다. 그래서 다음과 같은 방법(쓰레드 풀
)으로 이런 문제를 해결 하였다.
쓰레드 풀 방식은 풀안에 미리 쓰레드 여럿 만들어두고, 미리 만들어둔 쓰레드들로 요청을 처리를한다.
→ 요청이 들어올 때마다 쓰레드를 만들고 삭제하지 않아도 됨.
WAS의 멀티 쓰레드 지원 덕분에 개발자는 멀티 쓰레드에 대한 부분을 신경을 쓰지 않아도 된다.
즉 개발자 입장에서는 싱글 쓰레드 프로그래밍을 하듯이 소스 코드를 개발할 수 있다.
→ 하지만 엄밀하게 따지면 멀티 쓰레드 환경이므로 싱글톤 객체는 주의해서 사용해야 한다.
연결도 쓰레드 풀에서 가져온 쓰레드로 쓸까?
서버로 같은 요청이 들어오면 매번 다시하나?