<< Redis pub/sub를 활용한 푸시 기능 구현 | Home | 시스템 모니터링을 위한 도구들 >>

Vert.x - Node.js를 대체할 수 있는 프레임워크

Node.js에 필적할 만한 비동기 병렬 처리 프레임워크인 Vert.x가 이슈화되고 있는 것 같아서 Vert.x가 어떤 놈인지 살펴보고자 한다. Vert.x의 주요 내용은 InfoQ에서 기술한 vert.x ? JVM Polyglot Alternative to Node.js 아티클을 참고로 하여 기술하며 부족한 부분은 vertx.io의 내용을 참고하여 추가했다.

Vert.x 개요

Vert.x는 비동기적으로 확장 가능한 병렬 처리 어플리케이션을 위한 프레임워크이며, JVM에서 동작한다. Node.js를 대체할 수도 있고, JavaScript, Ruby, Groovy, Java언어를 사용하여 이 프레임 워크로 응용 프로그램을 만들 수 있다.
향후에는 Scala, Clojure, Python 언어에 대해서도 지원할 예정이라고 한다.

다음은 Vert.x에서 실행하는 웹 서버가 정적 파일을 제공하는 코드들이다.
// JavaScript
load('vertx.js')
vertx.createHttpServer().requestHandler(function(req) {
  var file = req.path === '/' ? 'index.html' : req.path;
  req.response.sendFile('webroot/' + file);
}).listen(8080)

# Ruby
require "vertx"
Vertx::HttpServer.new.request_handler do |req|
  file = req.uri == "/" ? "index.html" : req.uri
  req.response.send_file "webroot/#{file}"
end.listen(8080)

// Groovy
vertx.createHttpServer().requestHandler { req ->
  def file = req.uri == "/" ? "index.html" : req.uri
  req.response.sendFile "webroot/$file"
}.listen(8080)

// Java
import org.vertx.java.core.Handler;
import org.vertx.java.core.http.HttpServerRequest;
import org.vertx.java.deploy.Verticle;
public class Server extends Verticle {
  public void start() {
    vertx.createHttpServer().requestHandler(new Handler() {
      public void handle(HttpServerRequest req) {
        String file = req.path.equals("/") ? 
         "index.html" : req.path;
        req.response.sendFile("webroot/" + file);
      }
    }).listen(8080);
  }
}

내부 아키텍처 구조는..



내부적으로 하나의 Vert.x 인스턴스는 약간 스레드를 관리한다. 각 스레드는 이벤트 루프가 구현되어 있다.
Vert.x 응용 프로그램 인스턴스(verticle라고도 함)가 디플로이 되면 서버는 응용 프로그램 인스턴스에 할당 이벤트 루프를 선택한다. 그 응용 프로그램의 처리는 선택된 스레드가 한다. 동시에 많은 verticle가 작동할 수 있으므로 하나의 이벤트 루프는 동시에 여러 verticle이 할당 된다.

verticle과 같은 Vert.x에서 실행중인 응용 프로그램간에, 혹은 다른 Vert.x에서 실행되는 응용 프로그램과도 이벤트 버스를 통해 메시지 통신을 한다. 이것은 Erlang의 액터 모델 비슷하다. 이런 메시지 전달 방식의 목적은 응용 프로그램에서 다중 스레드 코드를 작성하지 않고도 여러 Vert.x에서 시스템을 확장할 수 있다.

이벤트 버스는 분산되어 서버 뿐만 아니라, 클라이언트 쪽 JavaScript에서도 사용할 수 있다.

병렬 처리와 메시지 전달 이외 Vert.x에는 다음과 같은 기능이 있다.
  • TCP/SSL 서버와 클라이언트
  • HTTP/HTTPS 서버와 클라이언트
  • WebSockets/SockJS 지원

Vert.x 특징들

  • 논 블럭킹.
  • Java7의 InvokeDynamic을 사용하여 개발됨. Java7 이상만 지원됨.
  • 네트워크 서버 와 클라이언트를 쉽게 만들수 있음.
  • Sinatra/Express 스타일의 간단한 리소스 라우팅 지원.
  • 다른 이벤트 드리븐 프레임워크와 달리 프로세스마다 여러 이벤트 루프를 가질 수 있음.

Vert.x 수명 주기

Vert.x 시작과 종료까지의 라이프 사이클은 다음과 같다.
  • Vert.x 인스턴스 시작
  • 응용 프로그램 의 배포(deploy)
  • 클라이언트 에서 사용
  • 응용 프로그램 제거(undeploy)
  • Vert.x 인스턴스 중지
Vert.x를 구동하고 어플리케이션을 실행, 중지하기 위해서는 위의 라이프 사이클 단계별로 존재하는 커맨드를 활용해야 가능하기 때문에 라이프 사이클 뿐만 아니라 각 사이클별로 존재하는 커맨드를 숙지하고 있어야 한다.

Vert.x의 이모저모..

아래의 내용은 VMWare의 엔지니어인 Tim Fox씨가 Vert.x에 대해 말한 내용을 InfoQ에서 정리한 내용이다. 그중 필요한 내용만 추려서 기록하고자 한다.

InfoQ : Vert.x 아키텍처는?
Tim : Vert.x의 핵심 부분은 Java로 작성되었으며, 지원 언어마다 API가 포함되어 있다. 각 언어별로 직접 호출하는 Java API는 직접 공개하지 않는다.
InfoQ : Node.js과 비교했을 때 벤치 마크는 가지고 했나?
공식적인 벤치 마크는 가지고 있지 않다.
InfoQ : Vert.x와 Netty를 비교하면 어떤가요?
Vert.x도 내부적으로, Netty와 NIO 2가 사용되고 있다. 그렇지만, Vert.x는 비동기 애플리케이션의 완성된 플랫폼이고 Vert.x 콤포넌트 모델과 파일 IO 등 Netty에는 없는 다양한 특징을 제공하고 있다.
참고로 Vert.x 라이센스는 Apache 2.0 License를 채용하고 있으며, 결과물은 Github에서 공개되고 있다. 동작 시 JDK 1.7.0 이상이 필요하고, Ruby를 사용하고 싶은 경우에는 별도 JRuby를 설치할 필요가 있다.
클라우드 지원 환경은 OpenShift와 Heroku에서 Vert.x를 실행할 수 있다. 아직 CloudFoundry는 아직 지원되지 않고 있다.

[참조 사이트]



Add a comment Send a TrackBack