http://www.cubrid.org/blog/dev-platform/understanding-vertx-architecture-part-2/



Why is Hazelcast Used?

Vert.x uses Hazelcast, an In-Memory Data Grid (IMDG). Hazelcast API is not directly revealed to users but is used in Vert.x. When Vert.x is started, Hazelcast is started as an embedded element.

Hazelcast is a type of distributed storage. When storage is embedded and used in a server framework, we can obtain expected effects from a distributed environment.

The most popular case is session data processing. Vert.x calls it Shared Data. It allows multiple Vert.x instances to share the same data. Of course, additional RDBMS, instead of Hazelcast, will bring the same effect from the functional side. It is natural that embedded memory storage can consistently provide results faster than remote RDBMS. Therefore, users who need sessions for e-commerce or chatting servers can build a system with a simple configuration by using only Vert.x.

Hazelcast allows a message queue use without additional costs or investments (without server costs or monitoring of message queue instances). As mentioned before, Hazelcast is a distributed storage. It can duplicate a storage for reliability. By using this distributed storage as a queue, the server application implemented by using Vert.x becomes a message processing server application and a distributed queue.

These benefits make Vert.x a strong framework in a distributed environment.

 



'Vert.x' 카테고리의 다른 글

Vert.x 와 Node.js 비교  (0) 2015.05.19
Vert.x 컴포넌트들의 이해  (0) 2015.05.19
Vert.x 의 Thread Pool & 이벤트루프 인사이드  (0) 2015.05.19
Vert.x + playframework = playVertX  (0) 2015.05.16
Vert.x 와 Akka 의 차이 ??  (0) 2015.05.16

쓰레드풀 

Vert.x 는 세가지 타입의 쓰레드 풀을 가진다.

  1. Acceptor: 보통 Socket 통신에 사용되는 그 accept 쓰레드. 하나의 쓰레드가 하나의 포트에 대하여 생성된다. 

  2. Event Loops :  Run루프와 같은데 CPU 코어개수와 같게 생성. 이벤트가 발생했을때, 상응하는 핸들러가 실행된다. 실행시 수행되어지면 , 이벤트루프는 다른 이벤트를 빠르게 읽는것을 되풀이한다.

  3. Background : 이벤트루프가 핸들러를 실행하거나 추가적인 쓰레드가 요구되어질때 사용된다.
    사용자는 
     vertx.backgroundPoolSize 나 환경설정으로 쓰레드의 갯수를 설정할수있다.디폴트는 20
    너무많은 쓰레드는 컨텍스트스위칭을 발생하므로 조심해야한다. 




이벤트 루프틑 디테일하게 보면  그것은 
Netty NioWorker 를 사용하는데  모든 핸들러들은 이벤트루프

위에 실행하는 Verticles 에 의해 구체화된다. 각각의 Verticles 객체는  그것의 특별한 NioWorker 를 가지고있다.  그래서 Verticle 객체는 항상 특정쓰레드위에서 실행된다는걸 보장한다. 그러므로 Verticles  은 쓰레드 세이프하게 쓰여질수있다. 


http://www.cubrid.org/blog/dev-platform/understanding-vertx-architecture-part-2/

'Vert.x' 카테고리의 다른 글

Vert.x 컴포넌트들의 이해  (0) 2015.05.19
Vert.x 의 Hazelcast 사용이유  (0) 2015.05.19
Vert.x + playframework = playVertX  (0) 2015.05.16
Vert.x 와 Akka 의 차이 ??  (0) 2015.05.16
Vert.x (mod-socket-io) & Socket.io 를 이용한 PUSH  (0) 2015.05.07



이 플러그인은 Play 안에 Vert.x 코어를 통합하는데  Play 에 Vert.x 이벤트버스를 노출시켜.

이건 play app 이 클러스터링 되도록 할수있지.  클러스터위에서 메세지를 전달하며 생산자&구독

자 초식을 펼치며 꽤나 놀라운것들을 사용할수있게 해.


무슨의미냐고? 

자 상상해보자. 네 클러스터에  N 개의 서버가 있어. 2명의 사용자가 sockJS 와 함게 연결되었어

서로서로 다른 서버에 말이지. 그런데도 그들은 같은 채널을 공유해 , 채팅룸이나 게임공간같은곳

에 말야. 한사람이 메세지를 채널에 던지면  다른사람은 실시간으로 그것을 받을수있게 된다는~



좀 쩔지?? 한번 해볼래?




Vert.x 와 Akka 는 아주 비슷한 점이 많다. 액터/리액티브 모델이란 점에서 둘은 앞으로 계속 동반자이자 경쟁자로
살아 갈 것으로 보인다. 따라서 둘을 비교 해
봐야 겠는데 아직 내가 그럴 경험은 없으니 남의 시야를 통해 살펴본다.
먼저 스택 오버플로우에서 Vert.x vs Akka 로 검색해보니 다음과 같은 글이 나온다.

http://stackoverflow.com/questions/21481238/difference-in-message-passing-model-of-akka-and-vert-x

정리하면 

외견적인 모습으로 둘은 매우 비슷하긴한데  비록 내 개인적인 생각일지 몰라도  Vert.x 는 Akka 보다는 

더  메세지큐 미들웨어들과 개념이 비슷한거 같다.  Vert.x 의 topology 는 좀 더 평면적인데  Verticle  은 

다른 Verticle 과 메세지를 공유하고 응답을 받어. 대신 Akka 는 좀 더 tree 와 비슷하지.

Vert.x  는 대중적인 여러 언어들사이에서 더 나은 상호운용성을 가질수있는데 ,  이것은 나한테 매우

중요한 선택포인트야.  니가 메세지큐 시스템들과 함께 액터를 같이 사용할 필요가 있을때 그리고 

좀더 복잡성을 다룰필요가있을때 Vert.x 는 그것을 좀더 간단하고 우아하게 다를수있게 한다. 

그래서 답은 흠흠 어느게 더 낫냐?  그건 그때 그때 달라요 이다. 

Vert.x 가 더 완전한 솔루션이라는걸 고려해야해. tcp, http server, routing, websocket 같은거 

지원하니깐 저런건 꽤나 놀랍지 암튼 졸라 full stack 이야.  api 도 매우 깔끔하지.  만약 네가 akka 를 

선택한다면 넌 play, xitrum  o spray 같은 framework 가 필요할것야,  개인적으로 난 별로지만 ~

또한 기억해둘건 vert.x 는 꽉 막힌 플랫폼이 아니란거야, 넌 vert.x 를 akka 또는 kafak 를 같이 쓸수 있

어.  예를 들어, 오버헤드없이 시스템의 부분들을  분리하는 방법을 Verticle 을 이용해   꽤나 간단하게 

만들지.  살랴살랴~

뭐 별로 큰 도움이 될거 같진 않은 글이다 ;; 
잡스런 기능들이 필요하면 Vert.x   /  순수한 Actor 로서의 기능이 필요하면 Akka ?? 
근데 Akka 도 잡스러운(?) 기능이 점점 많아지고 있습니다. akka.io  가보면 많은 내용을 볼 수 있겠다.
Akka 도 액터간 통신도 가능하지만 TCP와 HTTP 를 지원하니 그 자체 만으로 웹서비스를 제공 할 수 있지만
Akka 기반의 웹프레임워크인 플레이2를 사용하는 편인거 같다. Vert.x는 그에 비해 그 자체만으로 웹서비스 풀스택을 
구현하는게 좀 더 편한듯..

다음은 인포큐에서 진행한 Vert.x 의 창조자의 인터뷰에서 발췌한 글을 살펴보자. 원문은 요기 


인포큐 : 스칼라와 아카에 대한 생각은 어떤가요? 

팀폭스:  스칼라의 파워에 대해서 존경하고 매우 좋아합니다. 스칼라를 만들어 가는 사람들에 대해서도 마찬가지구요. 나에게 스칼라의 주요 문제는 너무 어렵다는것입니다. 많은 것들을 배우고 익숙해져야 하는데 자바같은 메인스트림이 결코 될 수 없을 거에요. 뭐 그렇지만 님들이 엄청 똑똑한 팀을 가지고 있고 스칼라를 잘 다룰 수 있다면 스칼라는 매우 좋은 선택이 될 거라고 봅니다. 

아카는 뛰어난 시스템입니다. 이것도 내가 매우 존중하고 있어요. 어떤 부분에서는 둘이 매우 비슷합니다. Vert.x 는 "액터 같은" 접근법을 동시성에 있어서 가지고 있죠. 우리도 데이터를공유하는 변경 가능성에 대해 피하려고 하고 있어요. 상태변경이 없는 순수성을 지향하죠.  새로운 리액티브 스트림 "표준" 을 이용하는데 Vert.x와 Akka는 상부 상조 할 것입니다. 양쪽 모두 동일한 Zeitgeist (시대정신) 을 가지고 있어요. 어떤 맥락에서는~ 

나는 이 둘이 둘 중하나만 택해야 한다고 보지 않습니다. 서로 같이 사용할 수 있을거에요.
꽤 괜찮은 탄력성 좋은 리액티브의 길로 가는 길에서 이 둘은 좋은 길동무가 될 것입니다.

역시나 뭐 별거 없네요 ㅎㅎ


배경에 대해서 먼저 말해보면 현재 IoT 관제시스템을 만들고 있는데, 

브라우저-웹서버 - 드라이버 -   중계서버 -  집중화서버  - 컨트롤러 - 디바이스 대략 이런식이다. 

웹서버는 Spring 으로 만들어져있으며, 드라이버 컴포넌트를 임베디드한다. 

프런트엔드는 AngularJS 기반의 자바스크립트 프로그램이다. 


이 시스템은 양방향인데  간단하게, 디바이스에서 넘어오는 데이타도 처리하고 ,

브라우져에서 디바이스로 보내는 데이터도 있다는 의미이다. 


이때 브라우져에서 웹서버로 넘길때에는 Rest API 를 적절히 사용하며 

디바이스에서 넘어오는 데이타를 브라우저에 적용할때, Vert.x 와 Socket.io 를 사용한다.



Node 이 WebSocket 을 쉽게 사용할수있도록 Socket.io 가 있는것처럼 Vert.x 도 WebSocket 을 쉽게 사용할수 있는 래퍼가 있는데 (https://github.com/keesun/mod-socket-io) 이것을 사용하였다.


참고자료 : http://www.slideshare.net/daumdna/devon-2012-b3-verx-socket

 


먼저 서버부분을 보자


- mod-socket-io-131.jar / vertx-core-1.3.1.final.jar / vertx-platform-1.3.1.final.jar 추가.


SwitchService  클래스 


@Service

public class SwitchService {


private static final Logger logger = LoggerFactory.getLogger(SwitchService.class);

@Autowired PushService        pushServer;    // PushService 객체를  연결해준다.


public PushService  getPushService(){

return pushServer;

}



PushService  클래스 


@Component

public class PushService extends DefaultEmbeddableVerticle {    


private static final Logger logger = LoggerFactory.getLogger(PushService .class);

private SocketIOServer io;   // SocketIO 래퍼 



@Override

// 객체가 생성되는 동시에 start 를 호출해서  HttpServer 를 실행한다.

// DefaultEmbeddableVerticle  클래스에서 Vertx 객체를 만들어서 넘겨준다.

public void start(Vertx vertx){


System.out.println("PushService start....!!");

HttpServer server = vertx.createHttpServer();  // HTTPServer 생성

io = new DefaultSocketIOServer(vertx, server); //  Socket.IO 래퍼 생성 

io.sockets().onConnection(new Handler<SocketIOSocket>() { // Connection 이벤트

public void handle(final SocketIOSocket socket) {

System.out.println("PushService.emit('welcome');");

socket.emit("welcome");


}

});

server.listen(19999);

}


public SocketIOServer getIo() {

return io;

}

public void  responseDelay(){

 

io.sockets().emit("exception","Delaying a response..");

}

public void  changeUserMode(){  

 

io.sockets().emit("exception" ,  "Mode is abnormal..");

}

public void  tramsNotConnected(){


logger.info("//     TRAMS is disconnected..              // ");   

io.sockets().emit("exception", "TRAMS is disconnected..");

}

}



SwitchRecvHandler  클래스  ( 사물로 부터 넘어온 데이타를 처리하는 객체 ) 


public class SwitchRecvHandler implements ReceiveHandler {


SwitchService switchService;

public SwitchRecvHandler( SwitchService switchService){

this.switchService = switchService;

}

public void handle(DataInfo di){

switchInfo data = (switchInfo) di;

....


 비지니스 로직 처리 

....


JsonObject json = new JsonObject();

json.putString("SWITCH-ID",data.getSwitchID());

json.putString("STATE", String.valueOf(data.isSwitchState()));

json.putString("TYPE", data.type());  

json.putString("DESCRIPTION", data.getDescription());

 

                 //  emit 함수로 key 가 'update' 인 데이터를  브라우저로 쏴준다.

switchService.getPushService().getIo().sockets().emit("update",json); 

}

}



클라이언트 부분 



monitering.html


<script src="../..//resources/lib/socket.io.js"></script>



monitering.js



var app = angular.module('moniteringApp', ['colorpicker.module', 'ui.bootstrap']);

app.controller('moniteringCtrl',function($scope, $http,$modal){

        

var socket = io.connect("http://localhost:19999");


// key 가 'update' 인 데이터 받아서 처리 
socket.on('update', function(msg){  
  console.dir(msg);
   $scope.$apply(function(){
    ...
 
   });
   
   $scope.reloadUsage();
    var deviceid =  FindPropertyInJson(msg,"DEVICE-ID") ;
    if($scope.currentSelectedNode == deviceid)
        getSelectedSwitchesUsage(deviceid);
   
    getSelectedNodeState(deviceid, false);
});

}


'Vert.x' 카테고리의 다른 글

Vert.x 컴포넌트들의 이해  (0) 2015.05.19
Vert.x 의 Hazelcast 사용이유  (0) 2015.05.19
Vert.x 의 Thread Pool & 이벤트루프 인사이드  (0) 2015.05.19
Vert.x + playframework = playVertX  (0) 2015.05.16
Vert.x 와 Akka 의 차이 ??  (0) 2015.05.16

+ Recent posts