1. 목적과 사용 사례
- Netty :
- 비동기 이벤트 기반의 네트워크 애플리케이션을 개발하기 위한 프레임워크 비동기? - 처리될 때까지 기다리는 것이 아니라 요청은 요청대로, 응답은 응답대로 따로 하는 것 → 독립적으로 돌아가는 행위
- 주로 고성능, 확장 가능한 네트워크 서버를 개발하는데 사용 → 처리를 기다리지 않고 바로 다른 작업을 진행할 수 있으니까
- 보통 웹, 게임, 채팅, 프록시 서버 등과 같은 네트워크 기반의 어플리케이션을 개발하는데 활용 → 언제 요청이 들어올지 모르는데, 요청이 들어오면 즉각처리해줘야하는 것들 중 성능이 요구되는 서비스에 사용된다.
- Tomcat :
- 서블릿(Servlet) 컨테이너로서, JSP와 Servlet 기술을 사용하여 Java 웹 애플리케이션을 실행하는데 사용
- 동시성 처리보다는 싱글 스레드 형식( 단일 요청→단일 응답 처리 )에 적합
2. IO모델
- <블로킹 vs 논블로킹>
-
블로킹 :
요청에 대한 결과를 바로 줄 수 없는 경우 그 결과를 기다리도록 하는 것을 의미
→ 요청에 대한 결과를 바로 받을 수 없는 상황에서 결과가 나타날 때까지 대기.
-
논블로킹 :
결과를 기다리지 않고 바로 종료
→ 다른 작업을 수행하는 것을 막지 않음.
- Netty :
- 네트워크 통신에 대한 이벤트 기반의 비동기 IO를 사용
- NIO(Non-blocking IO)를 기반으로 하여 매우 빠르고 확장 가능한 네트워크 서버를 만듦. → 붙잡아 두지 않고 다른 작업을 하게 둘 수 있으니까
- 대용량 데이터를 다루거나 수천 이상의 연결을 처리하는데 적합
- Tomcat :
- 전통적인 서블릿 기반의 동기식 IO를 사용함.
- 스레드 풀을 사용하여 요청당 하나의 스레드를 할당하는 방식 → 많은 수의 연결을 동시에 처리하기 어려움. (톰캣도 아예 동시성 처리를 못하는 건 아닌데 좀 어렵다)
3. 사용하기 쉬운 정도
4. 성능 및 확장성
- Netty : 비동기 IO를 사용하여 높은 성능, 확장성 뛰어남(대량의 연결을 효율적으로 처리)
- Tomcat : 스레드 기반의 모델 사용하며 스레드 당 커넥션을 관리하기에 많은 수의 연결을 동시에 처리하기 까다로움
5. ServerHttpRequest, ServerHttpResponse
- Netty : ServerHttpRequest/Response 사용 (비동기)
- Tomcat : ServletServerHttpRequest/Response 사용 (동기)
일반적인 서비스 확장 과정
처음 서비스는 Tomcat으로 구현 → 로드 밸런서로 시간을 벌면서 Netty로 바꿀 준비