ABOUT ME

-

Today
-
Yesterday
-
Total
-
  • Vert.x 가 좋다! (제 1회: 입문)
    JAVA 2013. 12. 2. 04:28
    반응형

    아래 글은 일본의 acro-engineer.hatenablog.com 사이트에 올라온 글을 번역한 것입니다.

    사내 세미나 준비를 하면서 매우 많은 도움을 받은 사이트입니다. Vert.x 에 대해 이해하기 쉽게 작성되어 있어 관심있는 분들께 도움이 되길 바라는 마음에 번역해서 올립니다. 

    ※ 번역은 구글이 했습니다. 전 단지 문맥상 이상한 것만 수정했을 뿐입니다.

    id:KenichiroMurata 입니다.

    최근 2.0이 발표 된 Vert.x에 대해 여러분은 아십니까?


    Vert.x 는 한마디로 표현하면

    Vert.x is a polyglot, non-blocking, event-driven Application Platform that Runs on the JVM.

    입니다. (공식 사이트에서 인용).

    JVM 에서 non-blocking에 event-driven 플랫폼이라는 것이 나의 마음에 드는 포인트 입니다! 아무튼, JAVA니까요. 이렇게 좋아하는 Vert.x 에 대해 앞으로 몇 차례에 걸쳐 본 블로그에서 기사를 써 가려고 합니다.


    Vert.x를 알자.

    Vert.x 를 알려면, 문서가 충실한 공식 사이트를 방문하는 것이 가장 좋습니다. 하지만, 양이 꽤 있으므로 추천 사이트를 소개합니다.

    너무 많잖아 라는 공격은 하지 말아 주세요. (^^;


    Vert.x 의 장점

    많이 있겠지만, 개인적으로는 아래의 5가지 입니다.

    1. asynchronous programming model for writing scalable non-blocking applications
    2. Advantage of the JVM ans Scales seamlessly over Available Cores
    3. a distributed event bus
    4. a powerful module system
    5. polyglot
    1. asynchronous programming model for writing scalable non-blocking applications

    Node.js 가 인기있는 이유도 같습니다만, non-blocking 비동기 API 에 의해 적은 자원으로 많은 클라이언트의 요청을 처리할 수 있습니다.

    참조: C10K 문제

    Vert.x를 사용하는 어플리케이션은 Verticle 이라는 실행 가능한 패키지를 만들어서 Vert.x Instance(Vert.x 프로세스)에서 실행시키기만하면, Verticle이 반드시 Event Loop(쓰레드)를 할당합니다. 따라서 Verticle 코드 작성에 동기화 및 독점 등을 생각할 필요가 없어 코드가 간단해 집니다.

    2. Advantage of the JVM and Scales seamlessly over Available Cores

    Node.js는 단일 쓰레드에서 처리하므로 멀티 쓰레드를 처리하려면, cluster를 사용하여 다른 프로세스를 수립해야 합니다. 하지만, Vert.x에서는 JVM에서 멀티 쓰레드를 처리할 수 있으므로, 하나의 Vert.x 인스턴스를 시작할 때 인스턴스 수를 지정하는 것만으로 멀티 쓰레드로 동작하게 하여 멀티 코어 리소스를 쉽게 활용할 수 있습니다. 또한 다른 서버에 Vert.x 인스턴스를 실행하여 cluster를 만드는 것도 가능합니다.

    3. a distributed event bus

    Vert.x는 아키텍처의 기반으로 distributed event bus를 가지고 있습니다. 이 event bus 를 사용하여 만든 Verticle과 하나 이상의 Verticle 이 모인 모듈(Module) 사이를 느슨하게 연결할 수 있습니다. event bus 는 Point to Point 와 Pub/Sub 메시징을 사용 할 수 있습니다. 메시지에는 여러가지 형태를 사용할 수 있지만 Vert.x에서는 여러 언어로 코드를 작성할 수 있도록 JSON 을 사용하는 것이 가장 좋은 것 같습니다.

    여러 Vert.x 인스턴스를 클러스터화 하는데도 event bus를 사용합니다. 또한, event bus bridge를 사용하면 클라이언트 측 javascript 의 event bus를 공유할 수 있습니다.

    4. a powerful module system

    Vert.x는 강력한 모듈 시스템을 가지고 있습니다. 모듈은 maven과 Bintray 에 게시 할 수 있며, 그곳에서 설치할 수 있습니다. Vert.x Module Registry 에는 이미 다음과 같은 모듈이 공개되어 있습니다.

    • io.vertx~mod-web-server
    • io.vertx~mod-mongo-persistor
    • io.vertx~mod-auth-mgr
    • io.vertx~mod-work-queue
    • com.jetdrone~mod-redis-io
    • com.jetdrone~yoke (Node.js의 Connect에 해당)
    5. polyglot

    JVM을 사용하며, 여러언어를 지원하기 때문에, Vert.x의 Verticle은 Java, Groovy, JavaScript, Ruby, Python 등으로 개발 할 수 있습니다. 또한 가까운 기일내에 Scala, Clojure도 지원한다고 발표되었습니다. Vert.x 2.0에서 각 언어의 기능도 위의 모듈로 개발되고 있으며, 필요한 것만 사용할 수 있습니다. 

    개인적으로 Java에서 쓸 수 있으면 좋지만, 예를 들면 다른 사람이 JavaScript와 Scala를 사용하여 개발 한 뛰어난 모듈이 있으면, 그것을 event bus를 통해 사용할 수 있어 좋습니다.

    기타

    이 외에도 다음과 같은 "가려운 곳에 손이 닿는" 기능이 많이 있습니다.

    • config에는 json 을 사용
    • logger 제공
    • Vert.x 인스턴스간에 공유할 수 있는 ShareData
    • Verticle 인스턴스를 멀티 부팅하는 경우, 동일한 포트를 바인딩하고 Vert.x 에서 라운드 로빈 처리를 함.
    • Eclipse 나 IntelliJ IDEA 에서 개발 지원
    • auto-redeploy
    • 테스트 프레임워크 (JUnit 확장)


    개발자 및 커뮤니티

    개발을 선도하고 있는 것은 @timfox씨. 이분은 RabbitMQ의 개발자이기도 합니다. @normanmaurer씨는 Netty 의 개발자이기도 하여, Vert.x는 Netty 와 긴밀하게 협력하면서 개발되고 있습니다. 두 사람 모두 현재는 RedHat 소속인 것 같습니다.

    커뮤니티는 Google Groups 를 중심으로 만들어져 있는데, 이 포럼의 최 상단에 있는 문구가 멋집니다. 

    Please don't use StackOverflow to ask Vert.x questions - ask them here!

    이 문구 덕분에(?) 정보가 뿔뿔이 흩어지지 않고 이 포럼에 모여 있습니다. 하루에 올라오는 게시물도 많고 활동적인 응답도 매우 빠릅니다. 저도 조금 신세를 졌습니다. 

    또한, 최근 Vert.x 프로젝트는 Eclipse Foundation의 산하에 있습니다.

    참조: eclipse/vert.x - GitHub


    Vert.x에서 Hello World

    실제로 Vert.x에 의한 개발은 어떨까요? 첫째로 공식 사이트를 참조하세요. Node.js 에서도 소개되는 것과 같은 web-server 코드를 Java, JavaScript, Groovy, Ruby, Python 으로 쓴 예제가 소개되어 있습니다.

    아무튼, 이것은 우리에게 이 기사만으론 외롭기 때문에, Java로 짠 Hello World 코드를 추가 합니다.

    public class MainVerticle extends Verticle {

     public void start() {

      container.logger().info("MainVerticle start");

      vertx.createHttpServer().requestHandler(new Handler <HttpServerRequest>() {

       public void handle (HttpServerRequest req) {

        req.response().headers().set("Content-Type", "text/plain");

        req.response().end("Hello World!");

       }

      }).listen(8080);

     }

    }


    Vert.x를 사용할 곳

    Vert.x 가 어떤 응용 프로그램에 적당할까? 라고 하면, WebSocket/SockJS를 사용한 실시간 Web 어플리케이션 서버, RESTFul API 에 의한 서비스 구현등입니다. 적은 리소스(서버)에서 다수의 클라이언트를 처리 할 수 있으며, 확장하는 것도 용이하다는 특징을 살릴 수 있는 곳에 사용하면 좋다고 생각합니다.

    서버 측 크롤러, Gateway 등을 개발하는데도 적합하다고 생각합니다. 

    일반적인 웹 어플리케이션에 적합하지 않다는 목소리도 있습니다만, Node.js 에 Express 가 있듯이, Vert.x 에는 web-server 같은 모듈도 있기 때문에 문제없이 사용할 수 있다고 생각합니다.


    Vert.x 에서 주의해야 할 점

    좋은 것만 써 왔기 때문에 내가 생각하는 주희해야 할 점도 작성합니다. 하지만, 써보니 Vert.x 의 문제라기 보다는 non-blocking, event-driven application platform을 사용하는 경우 주의해야 할 것이네요.

    1. 코드의 중첩이 깊어진다.

    비동기 처리시 콜백을 받을 핸들러를 등록하고 핸들러에서 다음 작업의 콜백 처리기를 등록하고... 하는 것이 많습니다. 이것은 코드 작성시 고민해야 할 점입니다. 아무것도 생각하지 않으면 나쁜 코드가 되어 버립니다.

    2. 차단 코드를 작성하지 말라.

    하나의 Event Loop를 여러 Verticle 에서 공유하기 때문에 차단 코드를 써 버리면 다른 Verticle 도 영향을 받게 됩니다. Thread.sleep(), Object.wait() 또는 CPU 자원을 많이 소비하는 라이브러리를 호출(예를 들어 JDBC) 할 때 입니다. 

    그럼 실제로 필요하게되면 어떻게 좋아? 라고하면, Vert.x는 Worker Verticle는 Event Loop는 다른 스레드 풀 (Worker Pool)에서 작동하는 Verticle가 준비되어 있기 때문에 이것을 사용하는 것으로 Event Loop에서 블록 처리를 분리 할 수​​ 있습니다 . 물론 event bus bridge 에서.

    3. 안정된 처리 상태 전이에주의 할 것

    모듈 내부 상태를 가지는 같은 기능을 개발하는 경우에는 상태 전이 테이블/상태 다이어그램 등을 사용하여 충분한 설계와 상태 시스템적인 구현상의 구조를 제공하여 개발하지 않으면 나중에 큰일입니다. 

    반응형
Designed by Tistory.