본문 바로가기

Network

[Network] Apache vs Tomcat vs Netty

Apache 와 Tomcat

먼저 Apache 는 WebServer 이고, Tomcat 은 WebApplicationServer 입니다.

즉, Apache 와 Tomcat은 독립적인 개념이고 비교를 하려면 WS 와 WAS 의 비교로 이어질 수 있습니다.

 

따라서 Apache를 설명할 땐 같은 WS인 Nginx 와의 비교를 통해 설명할 수 있습니다.

Apache는 Thread, process 기반 구조입니다. 클라이언트 요청하나당 하나의 스레드가 처리하는 구조입니다. 따라서 처리해야 할 요청이 많다면 메모리 및 cpu 낭비가 심합니다.

 

C10K

스마트 폰의 사용량이 증가하며 인터넷 사용량이 급격히 늘어났고, Process-Thread 방식으로 운영되던 Apache 는 동시 사용자 1만명일 때의 트래픽을 견디지 못하였습니다. 이것을 C10K 문제라 부릅니다.

하지만 Event-Driven 기반의 Nginx는 해당 문제에 대응하기 적합하였기에, Apache 보다 Nginx를 사용하는 비율이 증가하였습니다.

 

Tomcat

그럼 WAS 인 Tomcat은 무엇으로 정의할 수 있을까요. Tomcat 은 WAS 임과 동시에 서블릿 컨테이너로 정의 할 수 있습니다. 서블릿 컨테이너는 서블릿의 생명주기를 관리해주는 역할을 하는 컨테이너입니다. 또한 요청이 오면 자동으로 스레드를 생성하고 소멸시키는 등 멀티 스레드의 지원 및 관리 역할을 해주는 존재입니다.

 

Apache Tomcat

분명 Tomcat 관련 아티클을 읽다보면 Apache Tomcat이라는 단어를 보았을겁니다. 왜 Apache 와 Tomcat은 독립적인 개념인데 이런단어가 생겼을까요?이는 Tomcat 에서 편의를 위해 Apache 의 일부기능을 가져와서 제공해주기 때문입니다.

 

따라서 우리는 Tomcat 만을 사용하여 어플리케이션을 구현할 수 있습니다. 하지만 상황에 따라 (로드밸런싱을 위해) Apache 와 Tomcat 둘다 사용하는 경우도 존재합니다.

 

Netty

Spring WebFlux를 통해 프로젝트를 만들면서 접하게된 WAS 입니다.

 

netty 란 비동기 이벤트기반 네트워크 응용프로그램 프레임워크입니다.

요청을 보내고 응답이 올 때까지 기다리는 Blocking I/O 의 방식과는 반대인 Non-Blocking I/O 방식입니다.

 

여기서 재미있는 개념은 Netty 에 요청을 보내면 작업이 끝나지 않았는데도 우선 반환되고, 작업이 끝나면 나중에 응답을 받는 방식으로 동작한다는 점입니다.위 방식은 자바의 멀티스레드를 공부할 때 Future 와 같은 개념을 배울 때 보았던 방식입니다. 이렇듯 Netty 자체는 비동기 기반 Non-Bloking I/O 방식으로 동작하게 됩니다.

 

따라서 요청 당 1개의 스레드를 사용하는 Tomcat 보다 WebFlux 프레임워크에 적합한 WAS 이기 때문에 Spring WebFlux를 사용할 때 Spring 에서는 자동으로 Netty 를 설정해주게됩니다.

 

동작 구조

Netty 는 Channel 에서 발생하는 이벤트를 EventLoop 가 처리하는 구조로 동작합니다.

EventLoop란 이벤트를 실행하기 위해 루프를 돌고있는 스레드를 의미합니다.

 

위의 이미지처럼 이벤트를 Queue 에 Push 하고, Loop에선 Queue를 보고 있다가 꺼내 처리하는 방식으로 작동합니다.

또 기존의 멀티 스레드 이벤트 루프에선 모든 Loop 들이 하나의 Queue 를 보고 있어 실행순서가 섞이는 문제가 발생하는데, Netty 에서는 각 Loop Thread 마다 Event Queue를 가짐으로써 실행 순서 불일치의 문제가 발생하지 않게 되었습니다.

 

Channel

Channel 은 읽기, 쓰기, 연결, 바인드 등 I/O 작업을 할 수 있는 요소를 말합니다.

Channel은 Event-Loop 에 등록되고 (하나의 Event-Loop 에 여러 Channel 이 등록될 수 있습니다) Channel 에 Event 가 발생하게되면 Loop-Thread가 Event 를 처리하는 개념입니다.

 

'Network' 카테고리의 다른 글

[Network] IPSec VPN  (2) 2024.03.30
[Network] DMZ 존  (0) 2023.04.09
[Network] URI, URL, URN  (0) 2023.02.15
[Network] HTTP/x.x  (2) 2023.01.22
[Network] 브라우저에 www.naver.com을 입력하면 어떻게 될까?  (0) 2023.01.21