웹 애플리케이션 이해(서블릿, 쓰레드 풀)

웹 애플리케이션 이해(서블릿, 쓰레드 풀)

WebArchitetcure

  1. Client

    1. HTTP 요청
  2. WAS(Web Application Server)

    1. 서버 TCP/IP 연결 대기, 소켓 연결

    2. 쓰레드풀에서 쓰레드 할당

      • 자바인 경우 Web Container(Servlet Container)로 연결
  3. Web Container(Servlet Container)

    • Request 객체를 새로 만들어서 서블릿 객체 호출

      • HTTP 요청 메시지를 파싱해서 읽기

      • POST 방식, /save URL 인지

      • Content Type 확인

      • HTTP 메시지 바디 내용 파싱

      • 저장 프로세스 실행

    • Response 객체를 새로 만들어서 서블릿 객체 호출

    • 비즈니스 로직 실행

      • 개발자는 Request 객체에서 HTTP 요청 정보를 편리하게 꺼내서 사용

      • 개발자는 Response 객체에 HTTP 응답 정보를 편리하게 입력

  4. WAS(Web Application Server)

    • Resonse 객체에 답겨있는 내용으로 HTTP 응답 정보 생성

      • HTTP 시작 라인 생성

      • Header 생성

      • 메시지 바디에 HTML 생성해서 입력

      • TCP/IP에 응답 전달, 소켓 종료

Servlet Container

  • 톰캣처럼 서블릿을 지원하는 WAS를 서블릿 컨테이너라고 한다

  • 서블릿 객체를 생성, 초기화, 호출, 종료하는 생명주기를 관리한다

  • 서블릿 객체는 싱글톤으로 관리한다

    • 고객의 요청이 올 때마다 계속 객체를 생성하는 것은 비효율적이다

    • 최초 로딩 시점에 서블릿 객체를 미리 만들어두고 재활용한다

    • 모든 고객 요청은 동일한 서블릿 객체 인스턴스에 접근한다

    • 공유 변수 사용에 주의해야 한다

    • 서블릿 컨테이너 종료시 서블릿도 함께 종료된다

  • JSP도 서블릿으로 변환되어서 사용된다

  • 동시 요청을 위한 멀티 쓰레드 처리를 지원한다

Servlet

  • 자바를 사용하여 웹페이지를 동적으로 생성하는 서버측 프로그램 혹은 그 사양을 말한다

  • 웹 서버의 성능을 향상하기 위해 사용되는 자바 클래스의 일종이다

  • 서블릿은 자바 코드 안에 HTML을 포함하고 있다.

  • JSP는 HTML 문서 안에 Java 코드를 포함하고 있다.

Servlet Life-Cycle

  • 객체의 생성부터 사용(method call)의 주체가 사용자가 아닌 Servlet Container에게 있다

  • Servlet 객체가 필요 없게 되면 제거하는 일까지 Container가 담당하게 된다

    • Client의 요청이 끝날 때가 아니라 Redeploy할 때나 서버가 내려갈 때 destory()된다
  • Client가 요청(request)을 하게 되면 Servlet Container는 Servlet 객체를 한번만 생성하고, 한번만 초기화하며 요청에 대한 처리는 요청시마다 반복한다

동시 요청과 멀티 쓰레드

  • 필요한 쓰레드를 쓰레드 풀에 보관하고 관리한다

  • 쓰레드 풀에 생성 가능한 쓰레드의 최대치를 관리한다

    • 톰캣은 최대 200개 기본 설정(변경 가능)
  • 사용

    • 쓰레드가 필요하면, 이미 생성되어 있는 쓰레드를 쓰레드 풀에서 꺼내서 사용한다

    • 사용을 종료하면 쓰레드 풀에 해당 쓰레드를 반납한다

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

  • 장점

    • 쓰레드가 미리 생성되어 있으므로, 쓰레드를 생성하고 종료하는 비용(CPU)이 절약되고, 응답 시간이 빠르다

    • 생성 가능한 쓰레드의 최대치가 있으므로 너무 많은 요청이 들어와도 기존 요청은 안전하게 처리할 수 있다

  • 실무 팁

    • WAS의 주요 튜닝 포인트는 최대 쓰레드(max thread) 수이다

    • 값을 너무 낮게 설정하면?

      • 동시 요청이 많으면 서버 리소스는 여유롭지만, 클라이어트는 금방 응답이 지연된다
    • 값을 너무 높게 설정하면?

      • 동시 요청이 많으면 CPU, 메모리 리소스 임계점 초과로 서버가 다운된다
    • 장애가 발생한다면?

      • 클라우드면 일단 서버를 눌리고 이후에 튜닝한다

      • 클라우드가 아니면 서버를 튜닝한다

  • 쓰레드 풀의 적정 숫자

    • 애플리케이션 로직의 복잡도, CPU, 메모리, IO 리소스 상황에 따라 모두 다르다

    • 최대한 실제 서비스와 유사하게 성능 테스트해서 정해야 한다

      • 툴: 아파치 ab, 제이미터, nGrinder

참고자료