Spring MVC 1편 멀티 쓰레드

신재원·2023년 1월 15일
1

Spring MVC 1편

목록 보기
3/35

🧲 동시 요청 - 멀티 쓰레드

  • 백엔드 개발자로써 가장 중요한 개념이라고 합니다.

📣 트래픽이 많은 요청을 어떻게 해결해야되는지의 기본개념

쓰레드란 ?

  • 쓰레드는 애플리케이션 코드를 하나씩 "순차적으로 실행" 하는 것이며,
    자바의 main 메소드를 실행하면 main 이라는 쓰레드가 실행되는것입니다.
  • 쓰레드가 없다면 자바 애플리케이션 실행이 불가능하며,
    동시 처리가 필요하면 "쓰레드를 추가로 생성 가능" 합니다.
    ( 요청 마다 쓰레드를 생성 )

클라이언트의 요청이 들어오면, WAS에서 응답을 하고 서블릿을 호출합니다.

  • 이 호출을 쓰레드가 합니다.

🙋‍♂️ 쓰레드 vs 프로세스

간단하게 말해
프로세스는 프로그램을 실행,
쓰레드는 프로세스 내에서 여러가지 작업을 하는 개념

❓ 다중 요청

  • 고속도로 톨게이트 한개의 입구에 자동차가 몰리는 상황이이라고 생각해보면,
    클라이언트의 다중 요청이 들어오는 상황이고 쓰레드가 한개인 상황과 똑같습니다.
    ( 요청이 지연 된다 )

✔ 앞의 처리가 끝나야 뒤의 처리가 진행됩니다.

이러한 문제점의 해결방법은 ?

  • 요청마다 쓰레드 (톨게이트 입구) 를 생성하는것입니다.

장점

  • 동시 요청을 처리할 수 있습니다.
  • 리소스(CPU,메모리)가 허용할 때 까지 처리가능
  • 하나의 쓰레드가 지연 되어도, 나머지 쓰레드는 정상 동작합니다.
    ( 주요 장점 )

단점

  • 쓰레드의 생성 비용은 매우 비싸다고 합니다. ( CPU를 많이 사용 )
    • 응답의 속도가 늦어짐
  • 쓰레드는 컨텍스트 스위칭 비용이 발생한다.
    ( 쓰레드의 순서를 바꾸는 행동 )
  • 쓰레드 생성에 제한이 없다.
    • 고객의 요청이 많아지게되면, CPU 과부화로 서버가 다운 될수 있습니다.

👀👀 궁극적 해결 방법 (쓰레드 풀)

  • Pool에 쓰레드를 미리 생성 해놓는 개념입니다.
    ( 쓰레드 풀에서 쓰레드를 보관하고 관리 )
  • 쓰레드 풀에 생성 가능한 쓰레드의 최대치를 관리한다, 톰캣은 최대 200개 기본 설정 (변경 가능)


고객의 요청이 들어오게되면, "쓰레드 풀"에 요청을 합니다.

  • 쓰레드풀 에서 쓰레드를 꺼내서 사용하고, 사용 후에는 쓰레드 풀에 쓰레드를 반납 합니다.
    ( 종료 하는것이 아님 )

쓰레드 풀의 장점

  1. 쓰레드 풀에 쓰레드를 다 사용시, 다른 요청이 들어오게 되면 요청에 대해 대기하거나 거절 할수 있습니다.
  2. 고객의 요청마다 쓰레드를 생성하는것을 방지 합니다.
  3. 쓰레드를 생성할때 사용되는 CPU가 절약되고, 응답이 빠릅니다.

💬 정리

  • WAS가 멀티 쓰레드 기능을 지원 한다.
    ➡ 즉 개발자가 멀티 쓰레드 관련 코드를 신경쓰지 않아도 됨 ❗ (중요)
  • 개발자는 마치 자바 코드 작성하듯이 작성이 가능

❗ 주의
멀티 쓰레드 환경이므로 싱글톤 객체 (서블릿, 스프링 빈), 멤버변수 는 주의해서 사용 해야 한다.

🍘 번외 (실무 팁)

  • WAS의 주요 튜닝 포인트는 최대 쓰레드 수의 설정 입니다.

📍 이 값을 너무 낮게 설정 하면 ?

고객의 동시 요청이 많으면, 서버는 여유롭지만, 고객의 요청이 금방 응답 지연 될수 있음
( CPU를 너무 적게 사용, AWS 인스턴스를 많이사용하게 되는 불상사가 발생)

📍 이 값을 너무 높게 설정 하면 ?

고객의 동시 요청이 많으면, CPU 과부화로 서버가 다운 될수 있음

❓ 쓰레드 풀의 적정 숫자를 어떻게 찾을까 ?

상황에 따라 모두 다르다고 합니다.
성능 테스트를 통해 최대한 실제 서비스와 유사하게 성능 테스트를 시도합니다.

  • 사용 도구 : 아파치 ab, 제이미터, nGrinder (naver 에서 만든 툴)

0개의 댓글