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

공수정·2022년 4월 26일
0

spring

목록 보기
15/32
post-thumbnail

쓰레드

특징

  • 코드를 하나하나 순차적으로 한 줄씩 실행
  • 동시 처리가 필요하다면 쓰레드를 여러개 생성해서 처리

예시

: java에서 main()을 실행하면, main이라는 이름을 가진 쓰레드가 실행되면서, main()안에 적혀있는 코드문을 한 줄 한 줄 실행함

쓰레드를 사용해 요청 처리

단일 요청

쓰레드 1개 사용

요청이 들어오면 쓰레드에게 할당
-> 해당 쓰레드는 servlet을 호출해 코드를 한 줄 한 줄 실행
-> 결과를 응답한 뒤에는 해당 쓰레드는 휴식

다중 요청

쓰레드 1개 사용하면

1번째 요청인 요청1이 들어오면 쓰레드에게 할당
-> 해당 쓰레드는 요청1을 처리하기 위해서 servlet을 호출해 처리중
-> 이렇게 요청1 처리가 지연된 상태에서 요청2이 들어옴
-> 이렇게 되면 요청2요청1을 처리하는 쓰레드에게 할당되기를 기다려야함
=> 요청1요청2도 처리가 안되는 문제가 발생

쓰레드 여러 개 사용(요청마다 쓰레드 생성)

1번째 요청인 요청1이 들어오면 쓰레드에게 할당
-> 해당 쓰레드는 요청1을 처리하기 위해서 servlet을 호출해 처리중
-> 이렇게 요청1 처리가 지연된 상태에서 요청2이 들어옴
-> 요청2를 처리하기 위한 신규 쓰레드 생성
=> 요청1이 처리가 지연되어도 요청2를 처리하는데에는 문제가 없음

쓰레드 풀

요청마다 쓰레드 생성시 문제점

  • 쓰레드 생성 비용이 비쌈 : 요청마다 쓰레드를 생성하면 응답속도가 느려짐
  • 쓰레드 생성에 제한이 없음 : 요청이 너무 많이 들어오는 상황이라면, 쓰레드를 무한으로 생성하다가 CPU, 메모리 임계점을 넘어 서버가 죽을 가능성이 존재
  • 컨텍스트 스위칭 비용이 발생 : CPU는 한번에 여러가지 일을 하는게 아니라 한번의 일만하는데, 각 쓰레드를 돌아가며 조금씩 일을 하니 티가 안남. 대신 이때 여러 쓰레드를 돌아가면서 하는 시간이 쓰레드가 많으면 많을수록 늘어남

단점을 보완한 쓰레드 풀

미리 쓰레드를 만들어놓고 쓰레드 풀이라는 곳에 저장해놓음
-> 요청이 들어오면 들어올 때마다 쓰레드 풀에서 쓰레드를 꺼내서 할당
-> 요청처리가 끝나면 쓰레드를 삭제 하는 것이 아니라, 쓰레드 풀에 다시 넣음
-> 만약 미리 만들어놓은 쓰레드 개수를 초과하는 요청이 동시에 들어오면 해당 요청은 거절 or 대기처리

특징

  • 쓰레드가 이미 만들어져 있으므로 생성과 종료 비용이 절약
  • 쓰레드를 생성하고 종료하는 시간이 없어 응답시간이 줄어듬
  • 쓰레드 풀의 개수를 너무 낮게하면, 클라이언트 금방 응답지연
  • 쓰레드 풀의 개수를 너무 높게하면, 동시 요청이 많을 때 CPU, 메모리 임계점 초과로 서버 다운

WAS의 멀티 쓰레드 지원

  • 멀티쓰레드에 대한 부분은 WAS가 처리해 관련 코드를 신경쓰지 않아도 됨
  • 개발자는 싱글 쓰레드 프로그래밍 하듯이 편리하게 소스코드 개발

출처
1. 스프링 MVC 1편 - 백엔드 웹 개발 핵심 기술

profile
계속해서 공부하는 개발자입니다 :)

0개의 댓글