스터디에서 스프링 MVC 를 공부하면서, Servlet과 Servlet 컨테이너에 대해 설명한 적이 있다.
이때 내가 톰캣은 쓰레드 풀 방식으로 Http 요청을 처리한다고 하는 과정을 설명하였다. 이때 쓰레드 풀에 사용 되는 쓰레드의 갯수는 최대 200 개라고 했었다.
관련 내용
그후 “그렇다면 Http 연결과 응답에 대한 처리를 하는 쓰레드는 쓰레드 풀 안에 있는 쓰레드인가?” 라는 질문을 받았고, 이에 대해 제대로 답변을 하지 못했다.
따라서 좀 더 공부를 해보았고, 이 글을 쓰게 되었다.
Servlet Container와 클라이언트를 연결시켜준다.
톰캣으로 첫 요청이 들어오는 곳이다.
Connector 은 클라이언트의 요청을 받아 이를 토대로 Servlet이 처리 할 수 있는 HttpServletRequest를 생성한다.
Connector는 2가지 종류의 Connector이 있다.
Blocking IO 방식인 BIO Connector 와 None-Blocking 방식인 NIO Connector이 있다.
자바 4 부터 새롭게 추가된 입출력 방식(New Input Output)이다. 이후 자바 7에 버전 업데이트가 되어 자바 IO 와 NIO 사이의 일관성이 없던 클래스 설계를 바로 잡고 네트워크 지원(비동기 채널 등)기능이 강화되어 NIO2가 추가됨
IO | NIO | |
---|---|---|
입출력 방식 | 스트림 방식 | 채널 방식 |
버퍼 방식 | 넌버퍼 | 버퍼 |
비동기 방식 | 지원 안함 | 지원 |
블로킹/넌블로킹 유무 | 블로킹 방식만 지원 | 블로킹 / 넌블로킹 방식 모두 가능 |
None Buffer(IO) 는 대체로 느림
NIO는 버퍼를 사용하여 입출력하기 때문에 IO 보다 성능이 좋음
동기 비동기에 대한 차이 비교
💡 요약 : NIO는 불특정 다수의 클라이언트 연결을 넌블로킹이나 비동기 처리가 가능하다 → 과도한 쓰레드 생성을 막을 수 있다.이런 NIO 방식의 장점 때문에, 현재 톰 캣은 NIO 방식을 이용한 NIO Connector 을 사용하고 있다.
출처 https://velog.io/@jihoson94/BIO-NIO-Connector-in-Tomcat
BIO 방식은 한 번의 커넥션 당 하나의 worker 쓰레드가 생성되고 이를 처리한다.
하지만 NIO 방식은 하나의 worker 쓰레드가 다중 연결을 처리할 수 있다.
NIO는 하나의 쓰레드가 다중연결을 처리 할 수 있고, 이는 Http의 KeppAlive( 같은 위치로 부터 요청이 들어올 때마다 쓰리 핸드 쉐이크를 다시 하는 것이 아닌 포트를 열어두는 방식)방식을 컨트롤 할 수 있기 때문에 현재 톰캣에서 주로 쓰인다.
결론
톰캣에서는 NIO Connector를 사용하기 때문에 동시 요청을 넌 블로킹 방식으로 처리할 수 있다.
또한 Http 요청만을 처리하는 쓰레드는 쓰레드 풀에 있는 쓰레드가 아닌 Acceptor Thread가 따로 있다.