Notice
Recent Posts
Recent Comments
Link
«   2024/04   »
1 2 3 4 5 6
7 8 9 10 11 12 13
14 15 16 17 18 19 20
21 22 23 24 25 26 27
28 29 30
Tags
more
Archives
Today
Total
관리 메뉴

Jason's Blog

Vert.X : Polyglot, Non-blocking, Event-driven Platform - 1 본문

Runtimes

Vert.X : Polyglot, Non-blocking, Event-driven Platform - 1

Jason Jongjin Lim 2017. 11. 28. 19:52


1. Vert.X의 개념




Vert.X란 무엇일까. 검색을 해보면 다음과 같은 영문으로 설명이 되어 있는 것을 발견할 수 있다.

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

이 것을 다르게 해석해보면 "쉽게 확장 가능하고 비동기식 병렬 어플리케이션을 위한 프레임워크"라고도 볼 수 있다. 


JVM에서 동작하며 고성능을 지닌 이벤트 기반 어플리케이션 프레임워크이며, 비슷한 다른 플랫폼과는 다르게 Ruby, Java, Groovy, JavaScript 그리고 Python에 대한 API를 제공한다. 이 중 아무 런타임이나 골라서 쓰기만 하면 된다. 또한 공식 사이트에 Scala와 Clojure 지원에 대한 이야기도 나와있다. 




이 Vert.X의 특징 몇가지를 살펴보겠다.




- 매우 간단한 병렬 모델을 가진다. Vert.X로 어떤 코드에서든 싱글 스레드에서 개발할 수 있어서, 멀티 스레드 처리에 대한 고민(동기화, 휘발성 변수 처리, 명시적 락킹)이 줄어든다.


JVM의 메카니즘을 그대로 활용하여 여러 서버와 프로세스 사이에서의 통신을 직접 처리할 필요가 없다.


- 확장 가능한 non-blocking 어플리케이션을 위한 간단한 비동기식 프로그래밍 모델이다.


- 어플리케이션 구성요소들이 쉽게 통신할수 있도록 서버와 클라이언트 사이에 event bus를 구성한다. event bus는 손쉽게 웹 어플리케이션을 만들 수 있도록 브라우져의 JavaScript에 존재한다.


- XML 설정파일이 필요없다.


- Module 시스템으로 구성되며 private Module 저장소가 있다. 그래서 Vert.X 모듈을 쉽게 재사용하고 공유할 수 있다.


- 한 마디로 말하자면, Vert.X는 가볍고 빠르며 다양한 런타임 환경에서 쉽게 개발할 수 있는 Framework이다.




시대가 변함에 따라 어플리케이션은 무거운 Web, Native에서 Mobile, IoT같은 임베디드 환경으로 변화되고 있다. 이는 수 백, 수 천, 수 만개의 동시 접속이 가능하도록 확장성있는 플랫폼을 요구하게 된다. 그래서 개발자들이 Scale, High-performance 어플리케이션 개발이 가능하도록 굉장히 쉽고 빠른, 그리고 다양한 언어로 작성 가능한 Framework, Platform이 필요해 질 것이다.




Vert.X는 바로 그런 Framework이다.






2. Vert.X의 장점




많은 장점이 있지만, 대표적으로 5가지에 대해서 설명해 보겠다.



ㄱ) Non-blocking 비동기식 모델


- Vert.X는 Verticle이라는 패키지를 만들어서 Instance에 할당하면, Verticle이 Event Loop를 할당한다. 이 Event Loop는 쓰레드 하나가 귀속된다는 개념으로 이해하면 되는데, 이 메카니즘으로 인해 Verticle 코드 작성에 대해 동기화나 쓰레드 독점, Deadlock 등을 생각할 필요가 없어 코드가 매우 간단하고 쉬워진다.




ㄴ) Inter JVM 


- Vert.X를 설명하자면 Node.js와 비교를 하지 않을 수 없다. Node.js는 로직을 단일 쓰레드에서 처리한다. 만약 멀티 쓰레드가 필요하다면 Cluster같은 별도의 로직 구현을 통하여 기능을 구현하여야 한다. 하지만 Vert.X는 Verticle은 싱글 스레드로 로직이 돌아가면서, JVM에서 멀티 쓰레드를 처리할 수 있으므로, Vert.X 인스턴스를 시작할 때, 인스턴스의 갯수를 지정하는 행위 만으로도 Multi-Core 리소스를 활용할 수 있다.




ㄷ) 분산 Event bus


- Vert.X는 기반으로 Distributed event bus를 가지고 있다. 이 Event bus를 사용하여 만든 Verticle과 Verticle들이 모인 Module 사이를 느슨하게 연결한다(Loose Coupled). Event bus는 P2P와 Pub/Sub(multicast) 두 가지 구현 방법이 있으며 이 것으로 Vert.X 인스턴스를 클러스터링 하는데에 사용하기도 한다. 




ㄹ) Module System


- Vert.X는 모듈 시스템으로 구성이 되어있다. 모듈은 maven과 Bintray로 구현되어 있으며, repository를 통해 다양한 connector, utils 등을 구성할 수 있다.




ㅁ) Polyglot


- Vert.X의 Verticle은 JVM을 사용하여 다양하고, 독립적인 런타임을 구성할 수 있다. 기본적으로 Java(Vert.X만의 강점이다.), Groovy, Javascript, Ruby, Python으로 개발할 수 있으며, Scala, Clojure도 지원한다고 Announce 되었다.




그 밖에 Server Side Script를 사용하면서 불편했던 점이 많이 해소가 되었다. json으로 작성된 config나, 기본 logger, 인스턴스간 공유할 수 있는 Shared data 사용, Eclipse와 IntelliJ 에서의 개발 지원 등 실제 개발자들이 "많이 사용할 만한" 기능이 구현되어 앞으로 더 쓸모있는 Framework이 될 것 같다.

 





3. Vert.X의 용어




Verticle


Vert.X에서 배포 단위를 verticle이라고 한다. 위에서 언급했듯이 verticle은 Javascript. Java, Ruby 등 다양한 언어로 독립적인 구성이 가능하다.

Verticle은 실행 가능하도록 각각 main script(자바의 경우 Class)을 가진다. 이 것은 main에서 참조하는 여러가지 스크립트를 사용하거나 jar file등 다양한 리소스를 포함할 수 있다.

전체 시스템 구성은 하나의 verticle로 구성하거나, 여러개의 verticle을 이벤트 버스로 연결시켜 구성할 수 있다.




Vert.X Instance


하나 혹은 다수의 verticle은 하나의 Vert.X Instace에서 실행되며 하나의 instance는 JVM 인스턴스 내에서 동작한다. 이 인스턴스 내에서 여러 verticle이 동시에 실행되는 멀티 스레드 동작을 할 수 있다.

각각의 verticle은 static member, 전역 변수 혹은 그 밖의 수단들로 서로 통신할 수 없도록 각자의 classloader을 가지며 verticle을 분리한다.




Concurrency


각각의 verticle은 항상 같은 쓰레드에서 실행이 된다. 이 점은 개발자에게 매우 도움될 만한 사항이다. javascript 같은 항상 싱글 쓰레드에서 동작하는 런타임 환경에서는 별로 변화가 없지만, java, scala, ruby같은 멀티 쓰레드를 사용하는 환경에서 많은 도움이 된다. 상태 동기화에 대해 신경 쓸 필요가 없으며, deadlock이나 race condition에 대한 고민사항이 사라진다.




Event Handler


Vert.X는 Event-driven 프로그래밍 모델을 제공한다.

Vert.X에서 수행하는 대부분의 작업에는 event handler 설정이 포함된다. 예를 들어, handler가 설정된 verticle에서 TCP 소켓으로 데이터를 수신하면, 바로 handler가 호출된다.

Event Handle는 HTTP나 메시지 요청을 수신하고, Connection Open/Close에 대한 알림을 보내는 등 많은 역할을 할 수 있다.(API에 많은 예제가 있다)




Event Loop


내부적으로 Vert.X는 쓰레드의 수와 서버의 사용 가능 core 수를 일치시킨다. 이 쓰레드는 Vert.X의 Event Loop에 연결된다.
인스턴스가 할당되면 해당 인스턴스에 할당 될 event loop를 선택한다. 이 인스턴스에 대해 수행 될 후속 작업은 항상 쓰레드를 사용하여 전달되게 된다. 물론 한 번에 수 천개의 verticle이 실행될 수 있기 때문에, 여러개의 verticle이 하나의 Event Loop에 할당된다.




- http://najuung.tistory.com/82 내용에서 발췌




Message Passing


Verticle은 Event bus를 사용하여 같거나/다른 Vert.X 인스턴스에서 실행되는 verticle끼리 통신 할 수 있다. 

vert.x 인스턴스에 다수의 verticle 인스턴스를 포함하고 메시지 전달을 허용함으로써 시스템은 모든 verticle 코드의 멀티 쓰레드 실행을 허용하지 않고도 available core 를 통해 scaling을 할 수 있다.




Shared Data


Message Passing은 매우 유용하지만 모든 유형의 application에 대한 concurrency에 대해 항상 최적의 방법은 아니다.

예를 들어, 메모리 내 웹 캐시를 구현하는 application이 있다.

메모리 리소스에 대한 요청이 서버에 도착하면 서버는 캐시에서 리소스 available section을 체크하여 항목을 반환하고, 만약 존재하지 않다면 디스크에서 로드하여 캐시에 저장한다.

만약 이 application logic을 사용가능한 모든 core로 확장하고자 했을 땐, Message Passing을 사용하여 processing 하는 것은 문제가 생길 수 있다. 매우 복잡한 구조를 가질 수 밖에 없기 때문이다. 이 때, Shared Data를 사용하여 동일한 vert.x 인스턴스에서 서로 다른 verticle 인스턴스가 직접 액세스 할 수 있도록 만들 수 있다.







지금까지 Vert.X의 기본 개념과 특징, 용어들에 대해서 알아보았다.

다음 2편에선 Vert.X 사용시 고려사항, 기본 설치, Setting, Tuning, 그리고 사용 방법에 대해서 논해볼 것이다.

Comments