Tomcat은 HTTP 요청이 도착하면 요청이 처리될 때까지 요청을 대기열에 넣습니다. 이 대기열에 있는 요청들은 Thread Pool에 있는 스레드에게 할당되어 하나씩 처리됩니다. 각 스레드는 요청을 처리하고 작업이 완료되면 응답을 보낸 후 해당 요청에 대한 작업을 종료합니다. 작업이 완료된 스레드는 다시 스레드 풀로 돌아갑니다.
Tomcat에서 동시에 처리할 수 있는 Connection수는 일반적으로 50~500개의 스레드가 적절합니다. 즉, 하나의 Tomcat 서버는 동시에 최대 500여개의 연결을 처리할 수 있습니다.
서비스의 규모와 요구 사항이 증가함에 따라, 수십만 또는 수백만 개의 동시 연결을 처리해야 할 필요가 있을 수 있습니다. 그러나 일반적인 WAS로는 이러한 요구를 충족하기 어렵습니다.
또한, HTTP 뿐만 아니라, TCP와 같은 다른 request를 처리해야 하는 여러가지 Protocol 지원 문제도 있다.
또한, 단순한 Request/Reponse 기반의 HTTP 이외의 다른 프로토콜을 처리해야 하는 경우도 있습니다. 예를 들어, HTTP long polling이나 Streaming과 같은 Push 서비스를 구현하는 경우 클라이언트가 연결을 유지해야 하므로 많은 수의 동시 연결이 필요합니다.
Vert.x는 WAS와는 달리 스레드 풀을 사용하지 않고 하나의 스레드로 모든 작업을 처리합니다. 이렇게 하면 스레드 간의 컨텍스트 전환 오버헤드를 줄일 수 있으며 성능 향상에 도움이 됩니다. 또한, 멀티 스레딩에서 발생하는 잠금 처리나 공유 데이터 처리와 같은 문제에 대해 걱정할 필요가 없습니다.
Vert.x는 단일 스레드에서 동작하며, 이를 이벤트 루프라고 합니다. 클라이언트가 연결되면 이벤트 루프가 각 소켓에 대한 이벤트를 검사하고 이벤트가 발생하면 해당 함수를 실행합니다. 모든 연결된 소켓에 대해 이벤트 루프가 순차적으로 실행되며, 이벤트가 발생하면 해당 이벤트를 처리합니다.
일반적으로 하나의 이벤트 루프에서 10,000~20,000개의 연결을 처리하는 것은 큰 문제가 없습니다.
물론, 전체 클라이언트로 메세지를 Broadcast 하면, 당연히 성능이 내려가겠지만, 일반적인 P2P 형식의 이벤트 처리에는 큰 무리가 없습니다.
Vert.x 개념
- Vert.x Instance:
Vert.x의 실행 환경을 의미하며, 하나의 JVM 프로세스를 가리킵니다. - Verticle:
Vert.x 애플리케이션의 기본 구성 요소로, 하나의 프로그램을 나타냅니다. 비동기적으로 실행되며, 단일 스레드에서 동작하고 네트워크 I/O, 파일 I/O 등을 처리합니다. - Worker Verticle:
별도의 스레드 풀에서 실행되며 CPU 집약적인 작업을 처리하는 Verticle입니다. - Thread Pooling:
Worker Verticle이 사용하는 스레드 풀로, 작업을 병렬로 처리하고 동시성을 관리합니다. - Event Bus:
Verticle 간 통신을 위한 메시지 기반의 분산 이벤트 버스입니다. - Shared Data:
Vert.x 인스턴스 내에서 공유되는 데이터 구조를 지원합니다. - Module:
Vert.x 애플리케이션의 런타임 단위로, 라이브러리 및 애플리케이션 파일을 패키징한 형태입니다. - Pumping:
네트워크 Flow Control을 관리하여 메모리 소비를 제어합니다. - HA (High Availability):
고가용성을 제공하며, 비정상 종료된 인스턴스의 작업을 자동으로 다른 인스턴스로 이전합니다. - Clustering:
여러 Vert.x 인스턴스를 하나의 클러스터로 그룹화하여 분산 처리 및 통신을 가능하게 합니다.