1. 개요

비동기 서블릿이란, 말그대로 서블릿을 비동기로 처리하는방식이다.

Servlet3.0 부터 비동기방식이 지원되기 시작했다.

이전까지는 동기로만 가능했기때문에 요청이 많을시 부하가 생기거나 지연이 생길 가능성이 컸다.

 

2. Servlet 버전

위에서 Servlet 3.0 부터 비동기 방식이 지원되었다고했다.

그렇다면 먼저 Servlet 이 버전별로 어떤 특성이 있는지 살펴보자.

아래 표의 "Important Changes" 를 확인하면 각 버전별로 어떤점들이 크게 변했는지 확인할 수 있다. (출처: 위키피디아)

Servlet 3.0 버전은 2009년에 released 되었으며 Async Servlet 이 중요 항목으로 언급되어있음을 알 수 있다.

 

3. Synchronous ? Asynchronous ?

기존의 서블릿은 클라이언트가 요청을 할시, thread를 생성한 후 서블릿이 모두 처리되고 나면 thread 를 반환하는 방식이었다.

즉, 1개의 요청은 1개의 thread 가 할당된다는 뜻이다. 요청이 모두 처리될 때 까지 thread 는 thread pool 로 반환이 되지 않는다.

그런데 문제는 thread pool 은 제한이 있기때문에 무한정으로 thread를 사용할 수 없다.

서블릿 수행시간이 길다면 그만큼 thread 점유율이 높아질 것이고, max thread 에 도달하면 더이상 요청을 처리할 수가 없다.

응답을 완벽하게 끝낼때 까지 thread 를 점유하고 있는 것은 성능상 큰 단점이므로 그것을 보완하고자 Async 방식이 생겼다.

 

4. Asynchronous Servlet 이란

기존 서블릿과 다르게 비동기로 thread 가 사용된다.

모든 요청이 처리될때까지 대기하는 thread 없이 thread 를 사용하고 반환하고, 필요시 다른 thread를 다시 사용하고 반납하는 방식이다.

코드에 따라 처리 과정이 다르긴 하지만 아주 대략적인 과정은 아래와 같다.

 A. Client 가 X 요청을 보낸다.
 B. servlet이 비동기방식으로 호출된다.
 C. thread1 이 X 서비스를 요청한다.
 D. X 서비스를 요청한 후 thread1은 pool로 반환된다.
 E. 시간이 지난 후 C에서 요청한 X 서비스 응답이 온다.
 F. 응답이 처리된 후 thread2 에 응답이 작성되어 전송된다.
 G. thread2가 pool로 반환된다.
 
여기서 중요한 것은 D~F 사이에 대기하는, 점유된 thread 가 없다는 점이다.
비동기방식은 1개의 thread 가 응답이 완료될때까지 기다릴 필요가 없기때문에 D에서 반환된 thread1은 다른 요청을 처리할 수 있게되어 불필요한 thread 점유가 없다.
 

5. Sync ,Async 방식의 장단점

  Sync Async
장점

개발이 간단하고 직관적임

thread 가 여유있다면 속도가 빠름

소수의 thread로 여러 요청을 처리

대기하는 thread 가 없어 효율적인 자원사용

단점

요청이 완료될때까지 thread 반환이 안되므로 비효율적

빠른 처리를 위해 thread 가 많이 필요함

thread 를 고려해야하므로 개발이 어려울 수 있음