Vert.x Framework

항상 웃는 보담·2023년 8월 25일
0


Vert.x는 NodeJS와 같은 비동기 소켓 서버 프레임워크이고 JVM 위에서 동작한다.

기존의 동기식 소켓 서버에는 일반적으로 각 클라이언트의 연결에 전용 스레드가 할당이 되는데 이러한 모델, 방식은 동시에 수천 개의 스레드를 실행하게 되면 운영체제의 부하를 증가시키므로 성능과 확장성이 제한이되기 때문에 서비스의 규모와 용량이 커짐에 따라 연결이 많은 경우 비효율적이다

반면에 비동기 프레임워크는 메커니즘을 사용하여 차단 없이 I/O 작업을 수행한다.

Vert.x는 어떤 API 호출 스레드를 차단하지 않는다. 결과를 즉시 제공할 수 있으면 즉시 반환하고, 그렇지 않으면 일반적으로 이벤트를 수신하는 핸들러를 통해 처리한다.

스레드를 차단하지 않기 때문에 적은 수의 스레드로 많은 동시성을 처리할 수 있다.

Reactor 와 Multi-Reactor

Vert.x의 API는 대부분 이벤트 기반으로 이루어져 있다. 사용자가 관심 있는 일이 Vert.x에서 발생하면 Vert.x가 사용자에게 이벤트를 전송하여 호출합니다.

위의 말은 즉 이벤트가 사용 가능할 때 핸들러에 이벤트를 전달하는 event driven(이벤트 중심)이고 이벤트가 사용 가능할 때 핸들러에 이벤트를 전달한다.

Vert.x는 event loop라는 스레드를 사용하여 핸들러를 호출한다.


이러한 event loop는 이벤트가 도착하면 핸들러에 연속적으로 이벤트를 전달하게 된다.

Vert.x는 차단한는 것이 없기 때문에 이벤트 루프는짧은 시간 내에 엄청난 양의 이벤트를 전달할 수 있는데 단일 event loop는 수천개의 HTTP 요청을 처리할 수 있다.

이러한 event loop를 Vert.x에서는 Reactor Pattern이라고 부른다.

Reactor Pattern은 하나 이상의 입력에 의해 서비스 핸들러에 동시에 전달되는 서비스 요청을 처리하기 위한 이벤트 처리 패턴을 말합니다.

대표적으로 Reactor Pattern으로 구현되는 예시가 Node.js라고 할 수 있다.

이러한 event loop는 단일 스레드인데 문제점은 단일 코어에서만 한 번에 실행할 수 있기 때문에 단일 스레드인 Reactor application 즉 node.js 기반의 application을 멀티코어 서버로 확장하려면 다양한 프로세스를 시작하고 관리 해야한다는 문제점이 있다.

하지만 Vert.x는 다르게 동작하는데 Vert.x는 event loop대신에 각 Vert.x 인스턴스는 여러개의 event loop를 유지하여 사용 가능한 코어 수에 따라 개수를 선택할 수 있다.

정리 하자면 Node.js와 달리 단일 Vert.x 프로세스가 서버 전체에서 확장될 수 있다.

Reactor Pattern과 구분하기 위해서 이 패턴을 Multi Reactor Pattern이라고 부른다.

Vert.x Instance

Vert.x Object와 소통해야 Vert.x에서 많은 것들을 할 수 있다.

Vertx의 객체와 통신하고 싶다면 아래의 방법으로 인스턴스를 생성해서 사용할 수 있다.

Vertx vertx = Vertx.vertx();

인스턴스는 Vert.x의 제어 센터이며 클라이언트와 서버 생성, 이벤트 버스에 대한 참조 가져오기, 타이머 설정 등 거의 모든 작업을 수행하는 방법이다.

대부분의 응용 프로그램은 단일 Vert.x 인스턴스만 필요하지만, 예를 들어 이벤트 버스 또는 다른 그룹의 서버와 클라이언트 간의 분리가 필요한 경우 여러 Vert.x 인스턴스를 생성할 수 있습니다.

Verticle

Verticle이란 Vert.x에서 돌아가는 하나의 어플리케이션의 일부 혹은 하나의 프로그램이라고 이해하면 된다.

예시를 들어서 이해 해보자 하나의 서버가 있고 서버의 기능 단위로 프로그램을 자를 수 있다

서버로 오는 요청을 받는 프로그램 혹은 DB와 소통하는 프로그램 등 이러한 예시를 들 수 있다.

Verticle은 단일 스레드(Single Thread)이어서 한번에 하나의 작업을 처리하지만은 여러 인스턴스를 배포하여 코어와 머신에 걸쳐 확장할 수 있습니다.

Worker Verticle

일반 Verticle과 다르게 Multi Thread로 동작하게 된다.
기본적으로 Vert.x는 일반 Verticle을 사용하지만 선택사항에 따라서 다른 Verticle을 사용할 수 있다.

Vert.x에서 Event Loop와 Verticle

위의 설명으로 해당간의 관계가 이해가지 않을 수 있다. 추가적인 예시를 들어서 확실하게 이해 해보자

Event Loop는 단일 스레드로 이루어져있고 Vert.x에서는 여러개의 Event Loop를 다룰 수 있다.

맥도날드의 예시를 들어보자

Vert.x는 맥도날드 가게이고 여러개의 카운터를 가지고 있다고 생각 해보자

이 각 카운터는 Event Loop 라고 생각할 수 있는데 손님이 계속 반복되서 한명씩 오면은 손님의 주문에 따라서 지속적으로 고객에게 서비스를 제공하게 된다.

Verticle은 음식을 만드는 직원이라고 생각 할 수 있는데 카운터의 주문이 들어 올 때 햄버거를 담당하는 직원은 햄버거를 만들고 감자튀김을 담당하는 직원은 감자를 튀기게 될 것 입니다.

중요한 것은 이러한 Verticle 직원은 카운터(Event Loop)와 상호 작용하여 업무를 진행하게 되고 특정 Verticle Instance는 항상 한명의 카운터(Event Loop)와 작동한다는 점을 알아야 한다.

Event Bus


Event

이벤트는 특정한 일이 발생했음을 나타내는 알림 또는 신호이다.

발생한 일을 알리기 위해 버스로 전송하는 메시지 혹은 데이터를 Event라고 할 수 있다.

Bus

일반적으로 Bus는 컴퓨터 내부의 구성 요소간 또는 컴퓨터 간에 데이터를 전송하는 통신시스템을 지칭하는데 주로 사용한다.

Bus는 데이터(이벤트)를 전달할 수 있는 채널 또는 통로라고 할 수 있다.

Bus를 사용하면 소프트웨어의 여러 부분이 직접 연결되거나 서로를 인식하지 않고도 통신할 수 있다.

Handler

EventBus를 통해서 메시지를 보내면 결국 해당 특정 이벤트를 수신하는 핸들러에 도착하게 된다.

도착하게 되는 이유는 보통 handler에 이벤트를 받는 주소를 설정하기 때문이다.

이러한 핸들러에서는 발생한 일에 대한 메시지를 받게되고 핸들러에서 상황에 맞는 코드를 작성함으로써 발생한 일에 대해서 적절한 행동을 하게 된다.

간단한 요약

이벤트가 버스에 게시되고 해당 이벤트와 관련된 주소를 수신하는 핸들러가 이를 처리하게 됩니다.

결과적으로 이벤트 버스를 사용하면 애플리케이션 내의 컴포넌트나 모듈이 느슨하게 결합된 상태를 유지할 수 있으므로 보다 모듈화되고 확장 가능하며 유지 관리가 용이한 소프트웨어를 만들 수 있다.

Vert.x EventBus

모든 Vert.x 인스턴스에는 하나의 이벤트 버스 인스턴스가 있으며, 이벤트 버스는 eventBus 메소드를 사용하여 얻을 수 있다

Verticle 간에 통신이나, Vert.x Instance간의 통신이 가능하게 한다.

특징

  1. 여러 서버 노드와 여러 브라우저에 걸친 분산형 P2P 메시징 시스템을 형성합니다.
  2. 게시/구독, 지점 간, 요청-응답 메시징을 지원합니다.
  3. API는 매우 간단한데 기본적으로 핸들러 등록, 핸들러 등록 취소, 메시지 전송 및 게시가 포함됩니다.

Vert.x 정리

Reactive(반응형): Vert.x의 핵심은 reactive framework입니다. 즉, 비동기식 비차단 개발 모델을 장려합니다. Vert.x로 빌드된 애플리케이션은 최소한의 스레드로 많은 수의 동시 연결을 처리할 수 있으므로 확장성이 뛰어납니다.

Polyglot: Vert.x는 Java로 작성되었지만 다양한 언어를 지원하므로 Java, JavaScript, Groovy, Ruby, Kotlin 등 다양한 언어를 사용하여 Vert.x 애플리케이션을 작성할 수 있습니다.

Event-Driven(이벤트 중심): Vert.x는 이벤트 중심입니다. Vert.x의 모든 기능은 비차단 방식이므로 적은 수의 스레드로 많은 동시성을 처리할 수 있습니다. 이를 위해 Vert.x는 Java NIO(논 블로킹 IO) 라이브러리를 사용합니다.

Verticles: Vert.x의 기본 배포 단위로, 병렬로 실행되는 애플리케이션의 일부로 생각할 수 있습니다. 각 Verticles 인스턴스는 단일 스레드이지만 여러 인스턴스를 배포하여 코어와 머신에 걸쳐 확장할 수 있습니다.

이벤트 버스: Vert.x의 뛰어난 기능 중 하나는 분산 이벤트 버스입니다. 이를 통해 버티클은 위치에 관계없이 서로 통신할 수 있어 느슨하게 결합된 아키텍처를 촉진합니다. 이벤트 버스는 브라우저에서 실행되는 클라이언트 측 자바스크립트까지 확장됩니다.

확장성: Vert.x는 모듈식이며 커뮤니티에서 다양한 모듈(인증, 데이터베이스 액세스 등)을 제공합니다. 필요한 모듈이 없는 경우 직접 작성할 수도 있습니다.

profile
Happiness never decreases by being shared

0개의 댓글