컴퓨터 공부/자바스크립트

Vert.x 특징 및 Node.js와의 성능 비교

나정_ 2015. 8. 4. 14:00
Vert.x 특징 및 Node.js와의 성능비교

 

node.js가 단일 스레드라는 점 그리고 서버가 자꾸 죽는다는 단점을 대체할 수 있는  유사한 서버 프레임워크가 없을까 하다가 Vert.x 서버프레임워크를 알게 되었다.

 

그렇다고 해서 node.js를 보완한 프레임워크가 Vert,x 라는 것은 아니다.

 

자세한 내용은 특징과 함께 둘을 비교해가며 이해해 가보자.

 

A. Vert.x 특징

 

이벤트 기반 비동기 프로그래밍 모델 플랫폼이 최근 급부상하며 그 가치를 높여가고 있다.

 

Vert.x와 유사한 개발 모델을 제공하는 유명한 Node,js를 언급하지 않을 수 없다.

 

Node.js는 Ryan Dahl에 의해 2009년부터 시작된 프로젝트로 Vert.x보다 앞선 시기에 많은 관심과 이슈를 불러일으켰고 그 결과 오늘날 Vert.x보다 훨씬 풍부한 라이브러리와 모듈을 보유하고 있는 것이 사실이다.

 

Vert.x는 Node.js로부터 영감을 얻어 시작된 프로젝트인 만큼 기존의 Node.js를 접해본 개발자라면 아주 쉽고 빠르게

 

Vert.x에 익숙해질 수 있을 정도로 근본원리는 Node.js와 차이가 없지만

 

Node.js와 다른 양상을 띄는 구조와 성능을 가지고 있는 대표적인 몇가지 특징이 있다.

 

ㄱ. 여러 언어 지원

 

Node js가 자바스크립트 로 만들어 진 것에 비해 Vert,x는 자바를 기반으로 제작되었다.

 

그러나 Vert.x를 사용하는데 있어 반드시 자바를 필요하지 않으며 현재

 

- Ruby

- JAVA

- Groovy

- Javascript

- Python

 

에 대한 API를 제공하고 있어 다양한 언어를 이용해 어플리케이션을 작성할 수 있다는 점을 가지고 있다.

(추가적으로 Scala와 Clojure도 지원 예정이라 한다.)

 

ㄴ. Multireactor

 

많은 작업을 동시에 수행해야하는 애플리케이션은 다중스레드를 사용해 작업을 처리하도록 디자인하는 것이 일반적인 방법이다.

 

그러나 동시에 실행되는 2개 이상의 스레드 사이의 상호작용과 공유자원 동시 접근 문제등을 다루려면 세마포어, 뮤텍스같은 동기화 장치를 반드시 사용해야 하는데 이는 곧 데드락 같은 잠재적인 문제를 내재하고 있을을 의미한다.

 

그래서 다중 스레드를 사용하지 않고 단일 스레드 상에서 많은 작업을 동시에 수행할 수 없을까해서 나온 것이 Reactor 동시 처리 모델이다 .

 

그러나 Reactor방식은 스레드 동기화 문제에서 벗어날 수 있지만 본질적으로는 정교한 시분할 기법으로 각각의 작업을 순차적으로 처리하는 것에 지나지 않는다.

 

만약 블록될 가능성이 있는 API를 호출하거나 CPU 연산 집약적인 처리로 이벤트 처리가 지연된다면 이는 곧 애플리케이션 전체에 심각한 병목현상을 가져올 수 있음을 의미한다.

 

또한 여러개의 CPU를 가지고 이용 할 수 있는 병렬 처리에 대한 이점을 얻을 수 없다는 단점이 있다.

 

실제로 이러한 단점은 Node,js나 Vert.x에 그대로 적용되지만 Vert.x는 처음부터 이러한 단점을  보안하기 위한 구조를 갖추고 있어서 Node.js보다는 유리한 위치에 있다.

 

위 메인 상단에 제시한 Multireactor은 일반적인 Reactor처리모델이 단일 스레드에 동작하여 병렬 처리의 이점을 얻을 수 없는 단점을 보안한것이다.

 

Multireactor는 여러개의 CPU를 이용할 수 있는 병렬처리의 이점을 활용할 수 있게 한다.

 

이것은 시스템 CPU 개수만큼 이벤트 루프 스레드를 생성해서 이벤트를 처리하는데 각자의 이벤트 루프 스레드는

 

서로 다른 클래스로더로 만들어진 완전히 독립적인 코드를 실행하므로 스레드 동기화는 걱정하지 않아도 된다.

 

또한, 이렇게 특정 이벤트 루프 스레드에서 한번 실행된 코드는 절대 다른 이벤트 루프스레드에서 실행되지 않음을 보장한다.

 

 아래 그림은 4개의 cpu를 사용할 수 있는 시스템에서 Vert.x를 실행했을 때의 모습이다.

 

 

 

4개의 이벤트 루프 스레드가 생성되고 각 이벤트 루프 스레드는 서로 독립적인 Verticle(Vert,x의 이벤트 루프 스레드에서 실행되는 코드 단위를 Verticle이라고 함)을 실행한다.

 

각 Vertical은 서로 다른 클래스 로더로 만들어 지므로 A라는 Verticle이 이벤트 루프 스레드 1과 이벤트 루프 스레드 2에서 동시에 실행되고 있어도 서로 완전히 독립된 상태를 유지한다.

 

즉, Verticle 내에 static으로 선언한 변수를 포함한 그 어떤 값도 공유되지 않는다.

 

이 Verticle은 최초 할당된 이벤트 루프 스레드에서만 실행됨을 보장하며 그 외 이외의 루프 스레드에서는 실행되지 않는다. 


 

관련 예제 및 자세한 설명은 http://funhnc.tistory.com/26 를 참고하면 좋을 듯하다.