스프링 프레임워크의 내장톰캣
#tomcat
애플리케이션 서버가 클라이언트에게 요청을 받으면 어떤일이 일어나는지 궁금했다. 그러던중 스프링 프레임워크에는 내장 톰캣이 웹서버의 역할을 하는데, 톰캣이 요청을 처리하는 과정에 대해서 학습하게 되었다.
넷플릭스 블로그에서 Tomcat을 튜닝하기위해 Tomcat Http connector 관련 동작 흐름을 작성해둔것을 참고하여 Tomcat이 요청을 받는 구조를 그려보았다. High Level Threading Model for Tomcat Http Connector 글 내용중 일부..
Tomcat에는 connection을 수락하는 accept thread가 있습니다. OS와 클라이언트간에 TCP 핸드셰이크를 이룰때, 연결을 보관하는 큐가 하나이거나 여러개일 수 있다.
netflixtechblog: tomcat 튜닝을 위한 관련 테스트 글에 의하면 아래와 같은 동작을 거친다.
- TCP connection 으로 클라이언트가 요청
- TCP 핸드셰이크가 완료되지 않은 미완료 연결을 보관
- 완료되면 연결은 애플리케이션에서 사용할 수 있는 완료된 연결 큐로 이동 (acceptCount 매개변수가 이 큐의 크기를 제어하는데 사용)
- Tomcat 의 accept thread는 처리 가능한 워커쓰레드가 스레드풀 유후 상태인지 확인
- 워커 스레드가 하나라도 비면, Tomcat Connector가 완료 큐에서 맨앞 요청을 수락(accept)하여 할당되어 처리
- 큐 역시 다찬다면, 추가 요청은 타임아웃/거절 처리
정리
내부 대기 큐가 웹서버내에서 이루어지는게 아니라, 요청을 받는 OS레벨에서의 요청 대기 큐가 있다. 여기에는 TCP 미연결을 보관하는 큐와 TCP 연결 성공으로 인해서 애플리케이션이 연결된 세션을 가져갈 수 있도록 하는 큐 이렇게 2개가 보관되어있고 이것은 소켓자체에서 이루는 것이다.