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