클라이언트와 서버 사이드인 웹 어플리케이션에서,
사용자의 요청에 따라 Connection이 생성된다면
수많은 사용자가 요청을 했을 때 서버에 과부하가 걸리게 된다.
이러한 상황을 예방하기 위해서 미리 일정 개수의 Connection을 만들어 Pool에 저장하고
사용자의 요청이 발생하면 Connection을 제공한다.만약 빌려줄 수 없는 Connection이 없다면
해당 Connection 객체가 반활될때 까지 클라이언트는 대기 상태로 전환한다.사용자와의 연결이 종료되면 Pool에 다시 반환하여 보관하는 것을 의미한다.
DBMS나 기타 외부와의 접속이 빈번하게 필요한 시스템에서는 CRUD가 반드시 존재해야한다.
이 때 데이터베이스와Connection
을 맺는 작업은매우 느리며 많은 자원 소모를 요구한다.
모든 요청에 대해
Connection
연결을 요청해야하고
이러한 상황에다수의 사용자들이 동시다발적으로 요청을 한다면 서버가 다운
될 수 있다.이러한 상황을 대비하기 위해서 캐시 역할을 하는
Connection Pool
이 만들어지게 되었다.또한 DB에 접근하는
Connection의 수를 제한
하여 메모리와 DB에 걸리는 부하를 조정할 수 있다.
Connection Pool
과 비슷한 맥락으로Thread Pool
라는 개념도 존재한다.이 역시 매 요청마다 요청을 처리한
Thread
를 만드는 것이 아닌,
미리 생성한 pool 내의 Thread를 소멸시키지 않고 재사용
하여
효율적으로 자원을 활용하는 기법이다.
Thread가 컴퓨터 내부적으로 운영체제가 요청을 받아들여
메모리공간을 확보해주고 그 메모리를 스레드에게 할당한다.
스레드는 동일한 메모리 영역에서 생성되고 관리되지만
생성/수거에 드는 비용을 무시할 수 없다. -> 오버헤드 발생그렇기 때문에 스레드를 미리 만들어 놓는 것이다.
우리가 만든 어플리케이션에서
사용자로부터 들어온 요청
을 작업 큐에 넣고
Thread Pool
은작업큐에 들어온 Task일감
을미리 생성해놓은 Thread에게 일감을 할당
한다.
일을 다 처리한 Tread는 다시 어플리케이션에 결과 값을 리턴한다.
WAS에서 Thread Pool
과
Connection Pool 내의 Thread와 Connection의 수
는
직접적으로 메모리와 관련이 있다.따라서 많이 사용하면 메모리를 많이 점유한다.
이런 이유로 메모리를 위해 적지 지정한다면, 서버는 많은 요청을 처리하지 하지 못하고 대기할 수 밖에 없다.
WAS의 Thread 수
가Connection 보다 많은 것이 좋다.
모든 요청이 DB에 접근하는 작업이 아니기 때문이다.
매번 발생되는 작업을 병렬처리하기 위해 스레드(메모리)를 생성/수거하는데
이때 발생하는 오버헤드는 전체 성능을 저하시키기 때문에 Thread Pool 기법이 필요하다.또한 다수의 사용자의 요청을 수용하고 빠르게 처리하기 위해 필요하다.
너무 많이 만들면 메모리 낭비가 발생한다.
많은 병렬처리를 위해서 1억개의 스레드를 만들었지만
100개의 요청과 병렬처리를 했다면 나머지 스레드는 메모리만 차지한다.
노는 스레드가 발생할 수 있다.
만약 A,B,C 스레드 3개가 있는데 병렬적으로 일을 처리하는 과정에서
A,B,C 작업 완료 소요시간이 다른 경우, 예를 들어 A스레드가 일이 많은 경우라면
B,C는 일을 다하고 A가 일하는 것을 보고만 있는 현상이 발생한다.Java에서는 이를 방지하게 위해서
forkJoinPool
을 지원한다.
큰 업무를 작은 업무로 배분에서 일을 취합하는, 분할 정복 알고리즘 같은 기법이다.
Web Application Server
의 약자로,
웹 애플리케이션과 서버 환경을 만들어 동작시키는 기능을 제공하는 소프트웨어 프레임워크이다.
HTTP를 통해 사용자의 요청을 처리하고 그 결과를 다시 사용자에게 전달하는 역할을 한다.
일반적으로 WAS는 DB 서버와 같은 데이터베이스를 활용하고,
비즈니스 로직을 수행하며 그 결과를 사용자에게 전달하는 역할을 담당합니다.이렇게 함으로써 클라이언트와 데이터베이스 사이에서 다양한 역할을 수행하게 되며,
이러한 과정을 통해 동적인 컨텐츠를 제공할 수 있습니다.
WAS의 예로는
Apache Tomcat
,JBoss
,WebLogic
,WebSphere
등이 있다.
이들은 주로 자바 기반의 웹 애플리케이션(Java Spring Framework
등)을 위해 사용되며,
PHP
,.NET
,Ruby
등 다른 여러 언어를 위한 WAS도 있다.