비동기 서블릿의 의미를 알고 싶습니다.


안녕하세요. 서블릿 3에 이르러서 HTTP요청을 비동기로 처리하는 기능이 추가되었다고 하는데요. 제 생각엔 어차피 서블릿 자체가 톰켓 서버 내부에서 이미 스레드 개념으로 운용이 되고 있는데 거기에 또 비동기 서블릿 이라는 개념이 더해질 이유가 없지 않나 싶습니다. 혹시 제가 잘못생각하는 건가요? 감사합니다.

  • 2016년 09월 11일에 작성됨
    개발을 공부하는 학생 ANDROID / IOS / JSP / VB.NET / AWS

조회수 116


1 답변


좋아요
0
싫어요
채택취소하기

서블릿2 에서 사용하는 방식을 thread per connection 이라고 합니다. 클라이언트가 접속하게 되면 해당 클라이언트에 대한 thread를 한개 할당하고 해당 쓰레드가 사용자의 요청을 처리하는 방식입니다. 이 방식은 멀티쓰레드 활용을 개발자에게 가려주어, 마치 싱글쓰레드로 개발하는 것 처럼 서블릿 페이지를 만들어도 톰켓 등 컨테이너가 알아서 사용자 요청을 여러 쓰레드로 분산해 주는 장점이 있습니다.

이런 기능이 충분 하였으나 웹이 발전하면서 server push 같은 기능이 필요해 지게 됩니다. 이 기능을 위해서는 사용자와 서버간에 커넥션을 계속 유지해야 하는데 이 경우에 쓰레드가 계속 점유되어, 실제로는 일을 하지 않지만 자원을 계속 점유하고 있는 문제가 발생합니다.

jvm에서 thread 1개당 약 1MB(stack 512k + heap@)의 자원을 필요로 합니다. 요즘은 서버 자원이 꽤 넉넉해 졌지만, 서블릿3가 나오는 시점에만 해도 일반적인 was 메모리는 4G 이하였습니다. 단순 계산으로도 동시 접속자를 늘리기가 어렵습니다. 여기에는 메모리 문제뿐 아니라 쓰레드간에 컨텍스트 스위칭 비용도 포함됩니다.

서블릿3 에서 사용하는 방식을 thread per request라고 합니다. thread가 매 클라이언트 접속마다 할당되는 것이 아니라 일정한 크기의 thread pool 안에서 제공되는 thread를 매 요청마다 재사용 하는 방식입니다. 따라서 사용자 connection 수에 의존해서 thread수가 늘어나지 않습니다.

이런 방식의 장점은 자원 활용이라는 면에서 아주 훌륭하지만 코드를 복잡하게 만들기 때문에 용도에 맞는 적절한 활용이 필요합니다.

p.s: 기존 방식은 멀티 쓰레드로 동작하지만 각 쓰레드가 블락되기 때문에 문제가 생기게 됩니다. 멀티쓰레드 != 비동기 입니다.

  • 2016년 09월 11일에 작성됨
    프로그래밍 언어를 좋아하는 프로그래머

로그인이 필요한 기능입니다.

Hashcode는 개발자들을 위한 무료 QnA사이트 입니다. 작성한 답변에 다른 개발자들이 댓글을 작성하거나 좋아요/싫어요를 할 수 있기 때문에 계정을 필요로 합니다.
► 로그인
► 계정만들기
Close