1. 빠르게 훑어 보는 node.js와 Vert.x
조대협
http://bcho.tistory.com
VS
2. 소개
조대협 (조병욱)
• 벤처 개발자
• BEA 웹로직 기술 지원 엔지니어
• 오라클 장애 진단, 성능 튜닝
• NHN 잠깐
• 오라클 컨설턴트 (SOA,EAI,ALM,Enterprise 2.0)
• 오라클 아키텍트 (대용량 분산 시스템)
• MS APAC 클라우드 수석 아키텍트
• 프리렌서(좋은 말로 사장님)
• 지금은 어느 회사의 Chief(Cheap?) 아키텍트
블로그 : http://bcho.tistory.com
이메일 : bw.cho@samsung.com
페이스북 ServerSideArchitectGroup
https://www.facebook.com/groups/serverside
/
3. 오늘은?
1.빠르게 훑어 보는 Node.js
2.Node.js와 유사한 Vert.x 들여다
보기
3.Node.js와 Vert.x 비교하기
5. Node.js는?
• 자바 스크립트를 이용한 고성능 서버 프로토 타입
– 구글 크롬 V8 자바스크립트 엔진 사용
– CommonJS 기반
– 싱글 쓰레드 모델
– 비동기/논 블록킹 IO 기반
– 빠른 생산성, 아직은 비완성체
• 그런데 왜?
– 게임
– 높은 생산성
– 쉽다
– SOCKET.IO 푸쉬
– 레퍼런스
• 야머,링크드인,페이팔
10. Node.js의 내부구조
• 그런데, node.js는? Async/Non-Blocking
http://strongloop.com/strongblog/node-js-is-faster-than-java/
11. Node.js의 내부구조
• Non blocking/Async IO
동기식 IO 비동기식 IO(node.js)
• 커피 주문하고 기다리기 • 커피 주문하고 진동벨 받기
동시 처리할 수 있는 사용자 수 = 쓰레드 수
※ 동시 접속이 많은 시스템 (채팅,게임)에 불
리함
12. Node.js의 내부구조
• Node.JS의 Thread Pool
– OS에 따라, 일부 IO는 NonBlocking IO를 제공하지 않음
– 이 경우 자체 Thread Pool을 이용하여, Non-Blocking IO인 것 처
럼 Async 처리 해줌
13. 그럼 성능은?
• Node.JS가 항상 빠른 것은 아님..!!
Servlet + RESIN + MYSQL
Node.JS + MYSQL
http://www.techempower.com/benchmarks/#section=data-r8&hw=i7&test=query
14. 어디다 써먹나?
• 빠른 Prototype 개발
• Socket.IO를 이용한 Push 처리
• File Up/Download 같이 동시 연결수가 많고, IO
Intensive한 네트워크 스트리밍
• 간단한 Single Page App
15. Node.JS 주요 모듈
• 모듈
분류 모듈명
웹 MVC Express
REST API Express
Socket IO Socket.IO
인증/인가 Pass Port
데이타베이스
MySQL Native,Redis Native, Mongoose, Mongo-
Native
로깅 Winston
단위 테스트 Mocha
설치,배포 npm
서버 기동 Forever
빌드 스크립트 grunt
17. Express
• 웹 애플리케이션 개발 프레임웍
• REST API 지원
• Session,Cookie 일반적인 웹 기능 모두 지원
• Redis를 이용한 Session Clustering 지원
• node.js의 대세!!
※ MEAN STACK (MongoDB + Express + AngularJS + Node.js) – CF. LAMP
22. MongoDB
• MongoDB
– NoSQL (RDB Like – Index, Grouping, Sorting etc)
– Document base (Store JSON)
Command SQL MongoDB
Insert
insert into users ("name","city")
values("terry","seoul")
db.users.insert({_id:"terry",ci
ty:"seoul"})
Select select * from users where id="terry" db.users.find({_id:"terry"})
Update
update users set city="busan" where
_id="terry"
db.users.update( {_id:"terry"
}, {$set :{ city:"Busan" } } )
Delete delete from users where _id="terry"
db.users.remove({_id:"terry"
})
23. MongoDB
• MongoDB in node.js
– MongoNative (JDBC in Java)
• Support Connection Pooling/Async IO
24. MongoDB
• MongoDB in node.js
– Mongoose (Object Data Mapper – ODM)
• Scheme base
• Data validation
• Support Connection Pooling/Async IO
Scheme
Validator
Model
25. MySQL
• MySQL in node.js
– MySQL Native module
• Support Connection Pooling/Async IO
26. Socket.IO
• Web push method
1. AJAX (Comet)
upgrade
2. Web Socket
– Similar to Streaming
– Start from ws:// (not http://)
27. Socket.IO
• Socket.IO is
– Abstract WebSocket, FlashSocket, AJAX Long Polling, AJAX
Multi part Streaming, IFrame, JSONP Polling
• Why?
Source : http://caniuse.com
• Node.JS module
• Different supportability in
browser.
• Socket.IO supports web
push with various
mechanism
30. Socket.IO
• 이벤트 보내고 받기
– 이벤트 보내기 : socket.emit(“이벤트명”,{메세지});
– 이벤트 받기 : socket.on(“이벤트명”,function(data){});
– 나를 제외한 클라이언트들에게 이벤트 보내기
socket.broadcast.emit(“이벤트명”,{메세지});
– 나를 포함한 모든 클라이언트들에게 이벤트 보내기
io.socket.emit(“이벤트명”,function(data){});
– 다른 특정 소켓에 메세지 보내기
io.socket(소켓ID).emit(“이벤트명”,{메세지});
• 소켓에 데이타 바인딩
– 저장 : socket.set(“키”,”값”,function(){});
– 가져오기 : socket.get(“키”,function(err,value){});
– 지우기 : socket.del(“키”, function(err,value){});
• 현재 소켓의 ID 가져오기
– socket.id
31. Socket.IO
• ROOM (채널)
– 채널 조인하기 : socket.join(“룸이름”)
– 채널에서 나오기 : socket.leave(“룸이름”);
– 룸안에 있는 소켓에 이벤트 보내기
io.sockets.in(“룸이름”).emit(“이벤트”,{메세지});
– 룸안에 있는 나를 제외한 소켓에 메세지 보내기
socket.brodcast.to(“룸이름”).emit(“이벤트”,{메세지});
– 현재 생성되어 있는 룸 이름 읽어오기
io.sockets.manager.rooms
– 룸안에 있는 소켓 목록 리턴
io.sockets.client(“룸이름”);
32. Socket.IO
• 클러스터 구성
node.js node.js node.js
redis
Browser Browser Browser Browser
socket.iopub sub sub sub
redis channel : ‘dispatch’
haproxy
– Socket.IO 정보는 기본적으로 로컬 메모리에 저장됨
– 클러스터 (멀티 노드) 사용시 Redis 를 사용하면 알아서 노드간
공유됨
• Just change session store to redis
34. 비동기 코딩 패턴
• Async 프레임웍을 이용한 단순화
– 흐름 제어
• Serial : 순차 실행
• Parallel : 병렬 실행
• Waterfall : 순차 실행, 전단계의 결과를 다음 단계로 넘김
35. Node.JS는 잘 죽는다.
• V8 엔진 Memory Leak
• Catch가 안되는 에러가 나면 죽어버린다
• 해결책 1. – 다시 스타트
– forever
– Supervisor (코드 변경시 자동 재시작)
– nodemon (코드 변경시 자동 재시작)
– PM2
• 해결책 2. – process.on(‘uncaughtException’, )
– 죽을때 무슨 원인으로 죽었는지를 모른다.
– domainAPI를 사용한다.
※ http://www.slideshare.net/domenicdenicola/domains-20010482
36. 단위 테스트
• Mocha test framework
– 자바스크립트 테스트 프레임웍 (웹/node.js 지원)
– TDD와 BDD 양쪽 지원
TDD BDD
Language
assertEquals(count,5)
프로그래밍 언어에 가까움
$(count).should_be(5)
인간 언어에 가까움
테스트 케이스
개발
Spec Coding Test
Coding
Spec Test Coding
테스트 대상 단위 (함수)를 테스트 기능(시나리오)을 테스트
37. Clustering
• Clustering Module
– 하나의 Machine에서 여러개의 Node.js 인스턴스를 띄울 수 있음
– 같은 포트로 Listen
※ 굳이 그래야 하나? 어짜피 로드밸런서를 둬야 하는데
• 다른 Cluster 구성
– Cluster 모듈 없이 앞단에 Reverse Proxy (LB)배치
– Session, Socket.IO Sharing은 Redis로
42. Vert.x는
• Overview
– JVM위에서 동작
– 고성능 네트워크 IO 서버인 Netty를 기반
– Hazlecast (IMDG)를 이용한 데이타 버스
– 뒷단은 비동기 IO가 아니라서 Thread Pool을 이용한 비동기 IO 시뮬
레이션 처리
– 동작 구조는 Single Thread (멀티 쓰레드 지원*)
– Polyglot ( Java,Javascript,Python,Groovy,Scala 지원)
– 다른 자바 서버에 Embedding이 가능함 (Tomcat과 같은 서버에
embed해서 돌릴 수 있음)Java
Java
Scrip
t
Pyth
on
Groo
vy
Scala
Netty
Polyglot Event
Bus
(Hazelca
st)
Worker
Thread
Pool
JVM
43. Vert.x 개념 잡기
• Verticle
– node.JS의 하나의 route 모듈과 같은 개념 (Servlet)
– 독립적인 ClassLoader에 의해 로딩됨 (Isolation 됨)
: 다른 Verticle과 공유되지 않기 때문에, 멀티 쓰레딩을 신경 쓸
필요가 없음
44. Vert.x 개념 잡기
• Worker Verticle
– EventBus를 통해서 오는 작업을 뒷단에서 비동기 처리
– Thread Pool을 사용함
45. Vert.x 개념 잡기
• Event Bus
– HazleCast 기반의 메세지 큐 (cf. node.js Redis)
– 다른 서버로 이벤트가 들어오더라도, HazelCast에 의해서 해당
event handler가 있는 서버로 이벤트를 라우팅 해줌
46. Vert.x 개념 잡기
• Vert.x Instance
– 하나의 JVM Process
– 동시에 여러개의 Verticle을 수
행할 수 있음
– 동시에 여러개의 Event Loop
Thread를 수행할 수 있음
47. Vert.x 개념 잡기
• Socket.IO, Pumping (node.js의 Pipe)등 node의 기본 주
요 기능은 대부분 제공함
• DB나 FILE IO는 Non blocking IO 라이브러리가 없음
(Thread Pool로 Async 처리만 함)
• HA 기능 제공
– Vert.x Instance가 죽으면 다른 머신에서 자동 RE-START
48. 주의 사항
• JVM 기반이기 때문에 GC가 발생함
– 특히 HazelCast를 남용하면, Full GC Time 문제가 발생 가능
– 상용 버전의 HazelCast의 경우 Direct Memory Access를 이용하
여, 최소한의 GC Time으로 사용이 가능함
– 여러 인스턴스로 나눠서 메모리를 작게 잡고, 부하를 분산 시켜,
Full GC 소요 시간과, 발생 횟수를 줄여야 함
50. Vert.x vs Node.JS
Vert.x Node.JS
에러처리
에러가 나더라도 STACK을 출력
하고 죽음 (추적이 용이)
에러가 나면, Context 정보 없
이 죽음 (추적이 어려움)
안정성
Netty,HazleCast등 비교적 안정
된 엔진위에 개발됨
V8엔진 자체가 불안함
웹개발
없음 Express 등 웹 개발 프레임웍
이 풍부함
프로그래밍 언어
Javascript,Python,Groovy,Java,Sc
ala
Javascript
비동기 Non-
Blocking IO
쓰레드풀을 이용한 Emulation OS 수준의 Non-Blocking IO
사용 (IO 처리에 유리)
지원 모듈 100개 이하 40,000개 이상
에코 시스템
공식 서적 2개(100페이지 미만)
컨설팅,교육 업체 없음
레퍼런스,서적,교육,컨설팅등
매우 풍부
모니터링
없음. 자바 모니터링 툴 사용 nodeTime(APM) 등 상용 모니
터링 툴
클러스터링 HA
HazleCast와 HA 기능을 이용하
여 제공
Redis와 HaProxy등으로 자체
구현 필요
51. 결론
• Start up이나, B2C 서비스는 node.JS로 시작
– 자료 찾기 편리함
– 자주 죽어서 문제가 될 때면 돈 벌었음 (컨설팅 받으세요)
• 기술력이 충분하고, 고성능,고안정 서비스가 필요할 경우
Vert.x 고려
– 기반 엔진 자체가 튼튼하기 때문에 높은 성능과 안정성
– 모듈들이 적고, 자료가 부족하기 때문에, 자체 기술력이 높아야
함