본문 바로가기

Java/Vert.x

버텍스(Vert.x) 소개: 반응형(Reactive) 프로그램

버텍스(Vert.x)란?

Eclipse Vert.x는 JVM 위에서 동작하는 반응형(Reactive) 애플리케이션 개발을 위한 프레임워크입니다.

Vert.x 프레임워크를 간략히 버텍스라고 부릅니다.

더보기

Reactive는 Work-load의 증감에 따라 확장 또는 축소가 가능하고, 장애 발생에 대해서 탄력적으로 대응 할 수 있는 구조를 의미합니다.

버텍스는 포괄적인 웹 스택(Web stack), 반응형 데이터베이스 드라이버(Reactive database drivers), 메시징(Messaging), 이벤트 스트림(Event streams), 클러스터링(Clustering), 매트릭스(Metrixs) 등의 기능을 지원하는 일종의 툴킷(Tool-kit)입니다.

폴리글랏
(Polyglot)
리소스 효율적
(Resource-efficient)
동시성 & 비동기
(Concurrent and asynchronous)
유연성
(Flexible)
Java를 기반으로 작성되었지만, Java, Groovy, Kotlin, Ruby, Python, Javascript 처럼 여러가지 언어를 사용하여 버텍스 애플리케이션을 구현 할 수 있습니다. 고전적인 Blocking I/O에 비해서 리소스를 훨씬 효율적으로 사용합니다. 그럼에도 불구하고 Vert.x는 싱글 스레드 프로그램을 개발하듯이 코드를 작성 할 수 있습니다. Vert.x는 비동기 프로그램으로 구현합니다. API가 제공하는 Callback, Promise, Futures, Handler와 같은 간단한 기능을 사용하여 고성능의 비동기 프로그램을 작성 할 수 있습니다. Vert.x의 정체성은 프레임워크가 아니라 툴킷입니다. 현재 애플리케이션 구조에 관계 없이 Vert.x의 필요한 모듈을 선택하여 애플리케이션의 기능을 확장 할 수 있는 유연성을 갖고 있습니다.

Eclipse Vert.x와 Reactive에 대해서

버텍스는 JVM 위에서 동작하는 반응형(Reactive) 애플리케이션을 구축하기 위한 툴킷입니다.

반응형 애플리케이션은 워크로드(Work-loads)가 증가함에 따라서 확장 가능하며, 장애가 발생했을 때 복원력이 뛰어납니다.

또한 시스템 리소스를 효율적으로 사용하고, 오류로부터 보호하기 위해 대기 시간을 제어하므로 반응성이 좋습니다.

https://vertx.io/introduction-to-vertx-and-reactive/

버텍스는 최신 애플리케이션 작성을 위해 필요한 대부분의 것을 갖춘 대규모 반응형 모듈입니다.

  • 포괄적 웹 스택(Com­pre­hen­sive web stack)
  • 반응형 데이터베이스 드라이버(Re­ac­tive data­base dri­vers)
  • 메시징(Mes­sag­ing)
  • 이벤트 스트림(Event streams)
  • 클러스터링(Clustering)
  • 매트릭스(Metrics)
  • 분산 추적(Dis­trib­uted trac­ing)

동시성(Concurency)에 대한 해결

동시성에 대한 고전적인 방식은 스레드(Thread)의 사용입니다.

하나의 프로세스가 여러 개의 스레드를 구동하고, 스레드가 동시에 작업을 수행하면서 동일한 메모리 공간을 공유합니다.

버텍스를 사용하면 표면적으로 하나의 스레드에서 작업하는 것과 같습니다(실제로는 멀티 스레로 동작하지만, 이에 대한 고민을 최소화합니다).

https://vertx.io/introduction-to-vertx-and-reactive/

전통적인 멀티 스레드 방식에서 평균 워크로드를 상회하면 잦은 컨텍스트 스위칭(Context switching)으로 인해 커널에 이상이 생기게 됩니다. 

최신 커널에서는 우수한 스케줄링을 갖추고 있지만, 수 많은 연결이 필요한 서버에서 커널의 스케줄링에만 기댈 수는 없습니다.

스레드를 하나 만드는 데 몇 밀리세컨드가 걸리고, 약 1MB의 메모리를 사용하기 때문입니다.

https://vertx.io/introduction-to-vertx-and-reactive/

버텍스는 이벤트 루프(Event loop)를 사용하여 워크로드를 동시 다발적으로 처리합니다.

비동기 I/O(Asynchronous I/O)를 사용하면 더 적은 스레드를 사용하여 더 많은 연결을 동시 처리 할 수 있습니다.

I/O 작업이 필요하면 스레드를 차단(Blocking)하는 대신, 진행 할 준비가 되어있는 다른 작업(Task)으로 이동합니다.

그리고 작업이 완료되면 이전의 미뤄뒀던 작업을 재개합니다.

단, 이벤트 루프 내에서는 Blocking I/O 또는 처리에 오래 걸리는 코드를 실행하면 안됩니다.

https://vertx.io/introduction-to-vertx-and-reactive/

비동기 프로그래밍을 위해서는 일반적인 프로그래밍보다 더 많은 시간을 들여야합니다.

버텍스에서는 PromiseFuture 콜백 함수를 제공하여 비동기 연산을 위한 간단한 개발 방법을 제공합니다.

여러 가지 비동기 프로그래밍 모델:RxJava를 사용한 리액티브 프로그래밍 및 전통적인 방식에서는 Kotlin coroutines 역시 지원하므로, 개발 목적에 적합한 방식을 선택하여 사용합니다.

https://vertx.io/introduction-to-vertx-and-reactive/

실패-오류 처리로 부터 빠른 응답성 유지

장애 포인트는 모든 곳에서 발생 할 수 있습니다(데이터베이스가 다운되거나, 네트워크가 차단되거나 또는 의존 서비스로부터 응답이 오지 않는 등).

버텍스는 간단한 회로 차단기(Cicuit breaker)를 통해 대기 상태를 제어 할 수 있는 도구를 제공합니다.

https://vertx.io/introduction-to-vertx-and-reactive/

비동기 요청이 성사되었을 때 다음 프로세스를 진행하며, 비동기 요청 실패에 대한 실패 코드를 계단식으로 처리합니다.

이 모든 처리 역시 비동기 방식으로 동작합니다.

개발 커뮤니티 및 생태계

버텍스 스택은 End-to-End 리액티브 서비스 구축을 위한 모듈을 포함합니다.

효율적인 데이터베이스 처리, 이벤트 스트리밍과 메시징, 웹 소켓 등. Reactivers는 리액티브 개발을 위한 더 큰 커뮤니티입니다.

Vert.x Awesome 깃 리포지토리는 여러 프로젝트 진행을 위한 오픈 소스 커뮤니티입니다.

https://vertx.io/introduction-to-vertx-and-reactive/

정리 및 복습

  • Eclipse Vert.x는 JVM 위에서 동작하는 반응형(Reactive) 애플리케이션 개발을 위한 프레임워크입니다.이벤트 루프 스레드를 통해 전달되는 작업(Task)를 빠르게 처리합니다.
  • 작업들은 이벤트 루프 스레드에서 실행/완료 되기 위해 비동기로 콜백 됩니다.
  • 비동기 프로그래밍을 위해 간단한 함수 등으로 모든 비동기 처리 코드가 추상화 되어 있습니다.
  • 싱글 스레드에서 절차 지향 프로그램을 개발하듯 빠르게 프로젝트를 완성해 나갈 수 있습니다.
  • 프론트 부터 시작해서 백앤드까지의 전반적인 웹 스택, 메시징과 이벤트 스트리밍, 데이터베이스와 레디스, 매트릭스 등 개발에 필요한 모듈을 제공합니다.