[Spring MVC] 동시요청 - 멀티쓰레드

Hoon·2022년 11월 10일

Spring

목록 보기
11/18

쓰레드 (Thread)

클라이언트가 WAS에 요청을 하면 WAS는 서블릿을 호출하고 응답한다. 여기서 서블릿을 호출하는 것이 쓰레드이다.

쓰레드란 무엇일까?

쓰레드: 쓰레드는 어떠한 프로그램 내에서, 특히 프로세스 내에서 실행되는 흐름의 단위를 말한다.

애플리케이션 코드를 하나하나 실행하는 것이 쓰레드이다.
자바에서는 처음 실행하면 main이라는 쓰레드가 실행된다.
쓰레드는 한번의 하나의 코드만 실행 가능하다.
동시처리가 필요하면 추가로 쓰레드를 추가로 생성한다.

단일 요청

만약 요청이 하나만 온다면 쓰레드가 어떤식으로 사용되는지 알아보자.

쓰레드는 요청이 오기전까지 WAS에서 휴식하다가 클라이언트에서 요청이 오면 쓰레드에 요청을 할당한다. 그리고 쓰레드는 서블릿을 호출한다. 그다음 서블릿이 응답을 WAS에 응답을 하면 WAS가 클라이언트에 응답을 반환한다. 그후에 다시 쓰레드는 휴식한다.

다중 요청

만약 요청이 여러개가 동시에 올때 쓰레드의 사용 방법을 알아보자. (멀티 쓰레드)

문제발생

만약 요청을 할당받은 쓰레드가 서블릿을 호출하는데 오류가 발생하거나 호출하는데 시간이 길어진다면 그 후에 들어오는 요청들은 다 지연되는 상태가 발생한다.

해결방법 #1

첫번째 해결방법은 추가로 들어오는 요청마다 새로운 쓰레드를 생성해서 처리하는 방법이있다.

이 방법은 하나의 쓰레드가 지연되어도 나머지 쓰레드는 정상 작동한다는 장점이 있지만 다음과 같은 단점도 있다.

  • 고객 요청이 올때마다 쓰레드를 생성하면 응답 속도가 늦어짐
  • 컨텍스트 스위칭 비용이 발생
  • 쓰레드 생성에 제한이 없기 때문에 cpu, 메모리 임계점을 넘으면 서버가 죽어버림

해결방법 #2

첫번째 해결방법을 보완한 두번째 해결방법은 쓰레드 풀이 쓰레드를 관리하다가 요청이 오면 쓰레드 풀안에 있는 쓰레드들을 꺼내 사용하는 방법이있다. 요청이 끝나면 쓰레드를 쓰레드 풀에 반환하고 다시 재사용한다.

이 방법은 쓰레드가 미리 생성되있으므로 쓰레드의 생성 종료 비용이 절약되고, 응답시간이 빠르다는 장점이 있다.

최대 쓰레드가 모두 사용중이라면 기다리는 요청은 거절하거나특정 숫자만큼 대기하도록 설정할 수 있다.

톰캣에서는 쓰레드 풀에 최대 쓰레드가 200개로 저장되어있다. 개발자는 이 최대쓰레드를 적절하게 설정해야한다.

최대 쓰레드를 너무 낮게 설정하면 서버 리소스는 여유롭지만, 클라이언트는 금방 응답이 지연되고, 너무 높게 설정하면 cpu, 메모리 소스 임계점 초과로 서버가 다운된다.

결론

WAS가 위와 같은 방법으로 멀티쓰레드를 지원하는 덕분에 개발자는 마치 싱글 쓰레드 프로그래밍 하듯 개발할 수 있다.

Reference

스프링 MVC 1편 - 백엔드 웹 개발 핵심 기술 (김영한님)

profile
개발이 즐거워

0개의 댓글