빠르게 훑어 보는 node.js와 Vert.x
조대협
http://bcho.tistory.com
VS
소개
조대협 (조병욱)
• 벤처 개발자
• 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
/
오늘은?
1.빠르게 훑어 보는 Node.js
2.Node.js와 유사한 Vert.x 들여다
보기
3.Node.js와 Vert.x 비교하기
1. 빠르게 훑어 보는 node.js
Node.js는?
• 자바 스크립트를 이용한 고성능 서버 프로토 타입
– 구글 크롬 V8 자바스크립트 엔진 사용
– CommonJS 기반
– 싱글 쓰레드 모델
– 비동기/논 블록킹 IO 기반
– 빠른 생산성, 아직은 비완성체
• 그런데 왜?
– 게임
– 높은 생산성
– 쉽다
– SOCKET.IO 푸쉬
– 레퍼런스
• 야머,링크드인,페이팔
Node.js의 내부구조
• 내부 구조
Node.js의 내부구조
• ELP (Event Loop)
socket fd = array[연결된 socket
connections]
for(int i=0;i<fd.length;i++){
if(fd 가 이벤트가 있으면){
알고리즘 처리
}// if
}// if
epoll,kqueue,dev/poll,select,iocp
Node.js의 내부구조
• Single Thread Model
멀티 쓰레드 싱글 쓰레드(Node.JS)
CPU Intensive 한 작업이 많으면
다른 request 처리가 줄줄이 밀림
 무거운 로직을 돌리기에는 적절
하지 않음
Node.js의 내부구조
• 보통 서버는 (Blocking Call)
Source : http://blog.cloudfoundry.com/2012/06/27/future-proofing-your-apps-cloud-foundry-and-node-js/
Node.js의 내부구조
• 그런데, node.js는? Async/Non-Blocking
http://strongloop.com/strongblog/node-js-is-faster-than-java/
Node.js의 내부구조
• Non blocking/Async IO
동기식 IO 비동기식 IO(node.js)
• 커피 주문하고 기다리기 • 커피 주문하고 진동벨 받기
동시 처리할 수 있는 사용자 수 = 쓰레드 수
※ 동시 접속이 많은 시스템 (채팅,게임)에 불
리함
Node.js의 내부구조
• Node.JS의 Thread Pool
– OS에 따라, 일부 IO는 NonBlocking IO를 제공하지 않음
– 이 경우 자체 Thread Pool을 이용하여, Non-Blocking IO인 것 처
럼 Async 처리 해줌
그럼 성능은?
• Node.JS가 항상 빠른 것은 아님..!!
Servlet + RESIN + MYSQL
Node.JS + MYSQL
http://www.techempower.com/benchmarks/#section=data-r8&hw=i7&test=query
어디다 써먹나?
• 빠른 Prototype 개발
• Socket.IO를 이용한 Push 처리
• File Up/Download 같이 동시 연결수가 많고, IO
Intensive한 네트워크 스트리밍
• 간단한 Single Page App
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
Node.JS 주요 모듈
• NPM
• npm install {module}
• npm update {module}
• npm remove {module}
• npm info {module}
cf. Linux rpm
• package.json
※ C/C++ 기반의 Native module인 경우 컴파일러가 필요함
{
"name": "app",
"version": "0.0.1",
"dependencies": {
"express": "3.x",
"redis": "*"
}
“repository”: {“type”:”git”,”url”,”git://xxxx”}
cf. java maven pom.xml
Express
• 웹 애플리케이션 개발 프레임웍
• REST API 지원
• Session,Cookie 일반적인 웹 기능 모두 지원
• Redis를 이용한 Session Clustering 지원
• node.js의 대세!!
※ MEAN STACK (MongoDB + Express + AngularJS + Node.js) – CF. LAMP
Express
• Router
/app.js
(main)
/index.js
(route module)
• function index(req,res)
• function home(req,res)
/user.js
(route module)
• function list(req,res)
• function add(req,res)
HTTP GET/
HTTP GET /users
HTTP POST /users
Express
• Event Loop in Express
• REST API
Input
{ name:’Terry’,address:’Seoul’}
Output
{ result :’success’}
Express
• Template
Router (business logic)
+
Template (view)
• hogan.js (4257ms)
• ejs (5283 ms)
• jade - same author who made ejb. (13068ms)
※ Performance comparison https://github.com/Deathspike/template-benchmark
• Template Engines
[engine name (100,000 template rendering time ms)]
Express
• REST API
Input
{ name:’Terry’,address:’Seoul’}
Output
{ result :’success’}
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"
})
MongoDB
• MongoDB in node.js
– MongoNative (JDBC in Java)
• Support Connection Pooling/Async IO
MongoDB
• MongoDB in node.js
– Mongoose (Object Data Mapper – ODM)
• Scheme base
• Data validation
• Support Connection Pooling/Async IO
Scheme
Validator
Model
MySQL
• MySQL in node.js
– MySQL Native module
• Support Connection Pooling/Async IO
Socket.IO
• Web push method
1. AJAX (Comet)
upgrade
2. Web Socket
– Similar to Streaming
– Start from ws:// (not http://)
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
Socket.IO
• Server
Socket.IO
• Client
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
Socket.IO
• ROOM (채널)
– 채널 조인하기 : socket.join(“룸이름”)
– 채널에서 나오기 : socket.leave(“룸이름”);
– 룸안에 있는 소켓에 이벤트 보내기
io.sockets.in(“룸이름”).emit(“이벤트”,{메세지});
– 룸안에 있는 나를 제외한 소켓에 메세지 보내기
socket.brodcast.to(“룸이름”).emit(“이벤트”,{메세지});
– 현재 생성되어 있는 룸 이름 읽어오기
io.sockets.manager.rooms
– 룸안에 있는 소켓 목록 리턴
io.sockets.client(“룸이름”);
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
비동기 코딩 패턴 Serial Sequence PatternSync Code
Parallel pattern
CALLBACK HELL !!
비동기 코딩 패턴
• Async 프레임웍을 이용한 단순화
– 흐름 제어
• Serial : 순차 실행
• Parallel : 병렬 실행
• Waterfall : 순차 실행, 전단계의 결과를 다음 단계로 넘김
Node.JS는 잘 죽는다.
• V8 엔진 Memory Leak
• Catch가 안되는 에러가 나면 죽어버린다
• 해결책 1. – 다시 스타트
– forever
– Supervisor (코드 변경시 자동 재시작)
– nodemon (코드 변경시 자동 재시작)
– PM2
• 해결책 2. – process.on(‘uncaughtException’, )
– 죽을때 무슨 원인으로 죽었는지를 모른다.
– domainAPI를 사용한다.
※ http://www.slideshare.net/domenicdenicola/domains-20010482
단위 테스트
• Mocha test framework
– 자바스크립트 테스트 프레임웍 (웹/node.js 지원)
– TDD와 BDD 양쪽 지원
TDD BDD
Language
assertEquals(count,5)
프로그래밍 언어에 가까움
$(count).should_be(5)
인간 언어에 가까움
테스트 케이스
개발
Spec  Coding  Test
Coding
Spec  Test  Coding
테스트 대상 단위 (함수)를 테스트 기능(시나리오)을 테스트
Clustering
• Clustering Module
– 하나의 Machine에서 여러개의 Node.js 인스턴스를 띄울 수 있음
– 같은 포트로 Listen
※ 굳이 그래야 하나? 어짜피 로드밸런서를 둬야 하는데
• 다른 Cluster 구성
– Cluster 모듈 없이 앞단에 Reverse Proxy (LB)배치
– Session, Socket.IO Sharing은 Redis로
모니터링 툴
• Appdyanmics
연계 시스템간의 성능 모니터링 가능 코드별 수행 시간 추적 가능
모니터링 툴
• NewRelic Nodetime (얼마전에 AppDyamics에 인수됨)
– 1 노드 모니터링 무료
구간별 소요시간 분석 가능
기타 눈여겨 볼만한 모듈
• Passport : 인증 모듈,소셜 인증,Oauth,OpenID등 인증등 제공
• Winstone : 로깅 모듈
2. Vert.x에 대한 간략한 소개
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
Vert.x 개념 잡기
• Verticle
– node.JS의 하나의 route 모듈과 같은 개념 (Servlet)
– 독립적인 ClassLoader에 의해 로딩됨 (Isolation 됨)
: 다른 Verticle과 공유되지 않기 때문에, 멀티 쓰레딩을 신경 쓸
필요가 없음
Vert.x 개념 잡기
• Worker Verticle
– EventBus를 통해서 오는 작업을 뒷단에서 비동기 처리
– Thread Pool을 사용함
Vert.x 개념 잡기
• Event Bus
– HazleCast 기반의 메세지 큐 (cf. node.js Redis)
– 다른 서버로 이벤트가 들어오더라도, HazelCast에 의해서 해당
event handler가 있는 서버로 이벤트를 라우팅 해줌
Vert.x 개념 잡기
• Vert.x Instance
– 하나의 JVM Process
– 동시에 여러개의 Verticle을 수
행할 수 있음
– 동시에 여러개의 Event Loop
Thread를 수행할 수 있음
Vert.x 개념 잡기
• Socket.IO, Pumping (node.js의 Pipe)등 node의 기본 주
요 기능은 대부분 제공함
• DB나 FILE IO는 Non blocking IO 라이브러리가 없음
(Thread Pool로 Async 처리만 함)
• HA 기능 제공
– Vert.x Instance가 죽으면 다른 머신에서 자동 RE-START
주의 사항
• JVM 기반이기 때문에 GC가 발생함
– 특히 HazelCast를 남용하면, Full GC Time 문제가 발생 가능
– 상용 버전의 HazelCast의 경우 Direct Memory Access를 이용하
여, 최소한의 GC Time으로 사용이 가능함
– 여러 인스턴스로 나눠서 메모리를 작게 잡고, 부하를 분산 시켜,
Full GC 소요 시간과, 발생 횟수를 줄여야 함
VS
3. node.js와 Vert.x 비교
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등으로 자체
구현 필요
결론
• Start up이나, B2C 서비스는 node.JS로 시작
– 자료 찾기 편리함
– 자주 죽어서 문제가 될 때면 돈 벌었음 (컨설팅 받으세요)
• 기술력이 충분하고, 고성능,고안정 서비스가 필요할 경우
Vert.x 고려
– 기반 엔진 자체가 튼튼하기 때문에 높은 성능과 안정성
– 모듈들이 적고, 자료가 부족하기 때문에, 자체 기술력이 높아야
함

빠르게훓어보는 Node.js와 Vert.x

  • 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 비교하기
  • 4.
    1. 빠르게 훑어보는 node.js
  • 5.
    Node.js는? • 자바 스크립트를이용한 고성능 서버 프로토 타입 – 구글 크롬 V8 자바스크립트 엔진 사용 – CommonJS 기반 – 싱글 쓰레드 모델 – 비동기/논 블록킹 IO 기반 – 빠른 생산성, 아직은 비완성체 • 그런데 왜? – 게임 – 높은 생산성 – 쉽다 – SOCKET.IO 푸쉬 – 레퍼런스 • 야머,링크드인,페이팔
  • 6.
  • 7.
    Node.js의 내부구조 • ELP(Event Loop) socket fd = array[연결된 socket connections] for(int i=0;i<fd.length;i++){ if(fd 가 이벤트가 있으면){ 알고리즘 처리 }// if }// if epoll,kqueue,dev/poll,select,iocp
  • 8.
    Node.js의 내부구조 • SingleThread Model 멀티 쓰레드 싱글 쓰레드(Node.JS) CPU Intensive 한 작업이 많으면 다른 request 처리가 줄줄이 밀림  무거운 로직을 돌리기에는 적절 하지 않음
  • 9.
    Node.js의 내부구조 • 보통서버는 (Blocking Call) Source : http://blog.cloudfoundry.com/2012/06/27/future-proofing-your-apps-cloud-foundry-and-node-js/
  • 10.
    Node.js의 내부구조 • 그런데,node.js는? Async/Non-Blocking http://strongloop.com/strongblog/node-js-is-faster-than-java/
  • 11.
    Node.js의 내부구조 • Nonblocking/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
  • 16.
    Node.JS 주요 모듈 •NPM • npm install {module} • npm update {module} • npm remove {module} • npm info {module} cf. Linux rpm • package.json ※ C/C++ 기반의 Native module인 경우 컴파일러가 필요함 { "name": "app", "version": "0.0.1", "dependencies": { "express": "3.x", "redis": "*" } “repository”: {“type”:”git”,”url”,”git://xxxx”} cf. java maven pom.xml
  • 17.
    Express • 웹 애플리케이션개발 프레임웍 • REST API 지원 • Session,Cookie 일반적인 웹 기능 모두 지원 • Redis를 이용한 Session Clustering 지원 • node.js의 대세!! ※ MEAN STACK (MongoDB + Express + AngularJS + Node.js) – CF. LAMP
  • 18.
    Express • Router /app.js (main) /index.js (route module) •function index(req,res) • function home(req,res) /user.js (route module) • function list(req,res) • function add(req,res) HTTP GET/ HTTP GET /users HTTP POST /users
  • 19.
    Express • Event Loopin Express • REST API Input { name:’Terry’,address:’Seoul’} Output { result :’success’}
  • 20.
    Express • Template Router (businesslogic) + Template (view) • hogan.js (4257ms) • ejs (5283 ms) • jade - same author who made ejb. (13068ms) ※ Performance comparison https://github.com/Deathspike/template-benchmark • Template Engines [engine name (100,000 template rendering time ms)]
  • 21.
    Express • REST API Input {name:’Terry’,address:’Seoul’} Output { result :’success’}
  • 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 innode.js – MongoNative (JDBC in Java) • Support Connection Pooling/Async IO
  • 24.
    MongoDB • MongoDB innode.js – Mongoose (Object Data Mapper – ODM) • Scheme base • Data validation • Support Connection Pooling/Async IO Scheme Validator Model
  • 25.
    MySQL • MySQL innode.js – MySQL Native module • Support Connection Pooling/Async IO
  • 26.
    Socket.IO • Web pushmethod 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
  • 28.
  • 29.
  • 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.jsnode.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
  • 33.
    비동기 코딩 패턴Serial Sequence PatternSync Code Parallel pattern CALLBACK HELL !!
  • 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.
    단위 테스트 • Mochatest 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로
  • 38.
    모니터링 툴 • Appdyanmics 연계시스템간의 성능 모니터링 가능 코드별 수행 시간 추적 가능
  • 39.
    모니터링 툴 • NewRelicNodetime (얼마전에 AppDyamics에 인수됨) – 1 노드 모니터링 무료 구간별 소요시간 분석 가능
  • 40.
    기타 눈여겨 볼만한모듈 • Passport : 인증 모듈,소셜 인증,Oauth,OpenID등 인증등 제공 • Winstone : 로깅 모듈
  • 41.
    2. Vert.x에 대한간략한 소개
  • 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 소요 시간과, 발생 횟수를 줄여야 함
  • 49.
  • 50.
    Vert.x vs Node.JS Vert.xNode.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 고려 – 기반 엔진 자체가 튼튼하기 때문에 높은 성능과 안정성 – 모듈들이 적고, 자료가 부족하기 때문에, 자체 기술력이 높아야 함