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

9,531 views
8,682 views

Published on

node.js 의 구조와, 기능, 프레임웍등
vert.x에 대한 간략한 소개와 node.js와 비교를 통한 각 서버에 대한 장단점 분석

Published in: Engineering
0 Comments
108 Likes
Statistics
Notes
  • Be the first to comment

No Downloads
Views
Total views
9,531
On SlideShare
0
From Embeds
0
Number of Embeds
105
Actions
Shares
0
Downloads
238
Comments
0
Likes
108
Embeds 0
No embeds

No notes for slide

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

  1. 1. 빠르게 훑어 보는 node.js와 Vert.x 조대협 http://bcho.tistory.com VS
  2. 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. 3. 오늘은? 1.빠르게 훑어 보는 Node.js 2.Node.js와 유사한 Vert.x 들여다 보기 3.Node.js와 Vert.x 비교하기
  4. 4. 1. 빠르게 훑어 보는 node.js
  5. 5. Node.js는? • 자바 스크립트를 이용한 고성능 서버 프로토 타입 – 구글 크롬 V8 자바스크립트 엔진 사용 – CommonJS 기반 – 싱글 쓰레드 모델 – 비동기/논 블록킹 IO 기반 – 빠른 생산성, 아직은 비완성체 • 그런데 왜? – 게임 – 높은 생산성 – 쉽다 – SOCKET.IO 푸쉬 – 레퍼런스 • 야머,링크드인,페이팔
  6. 6. Node.js의 내부구조 • 내부 구조
  7. 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. 8. Node.js의 내부구조 • Single Thread Model 멀티 쓰레드 싱글 쓰레드(Node.JS) CPU Intensive 한 작업이 많으면 다른 request 처리가 줄줄이 밀림  무거운 로직을 돌리기에는 적절 하지 않음
  9. 9. Node.js의 내부구조 • 보통 서버는 (Blocking Call) Source : http://blog.cloudfoundry.com/2012/06/27/future-proofing-your-apps-cloud-foundry-and-node-js/
  10. 10. Node.js의 내부구조 • 그런데, node.js는? Async/Non-Blocking http://strongloop.com/strongblog/node-js-is-faster-than-java/
  11. 11. Node.js의 내부구조 • Non blocking/Async IO 동기식 IO 비동기식 IO(node.js) • 커피 주문하고 기다리기 • 커피 주문하고 진동벨 받기 동시 처리할 수 있는 사용자 수 = 쓰레드 수 ※ 동시 접속이 많은 시스템 (채팅,게임)에 불 리함
  12. 12. Node.js의 내부구조 • Node.JS의 Thread Pool – OS에 따라, 일부 IO는 NonBlocking IO를 제공하지 않음 – 이 경우 자체 Thread Pool을 이용하여, Non-Blocking IO인 것 처 럼 Async 처리 해줌
  13. 13. 그럼 성능은? • Node.JS가 항상 빠른 것은 아님..!! Servlet + RESIN + MYSQL Node.JS + MYSQL http://www.techempower.com/benchmarks/#section=data-r8&hw=i7&test=query
  14. 14. 어디다 써먹나? • 빠른 Prototype 개발 • Socket.IO를 이용한 Push 처리 • File Up/Download 같이 동시 연결수가 많고, IO Intensive한 네트워크 스트리밍 • 간단한 Single Page App
  15. 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. 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. 17. Express • 웹 애플리케이션 개발 프레임웍 • REST API 지원 • Session,Cookie 일반적인 웹 기능 모두 지원 • Redis를 이용한 Session Clustering 지원 • node.js의 대세!! ※ MEAN STACK (MongoDB + Express + AngularJS + Node.js) – CF. LAMP
  18. 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. 19. Express • Event Loop in Express • REST API Input { name:’Terry’,address:’Seoul’} Output { result :’success’}
  20. 20. 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)]
  21. 21. Express • REST API Input { name:’Terry’,address:’Seoul’} Output { result :’success’}
  22. 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. 23. MongoDB • MongoDB in node.js – MongoNative (JDBC in Java) • Support Connection Pooling/Async IO
  24. 24. MongoDB • MongoDB in node.js – Mongoose (Object Data Mapper – ODM) • Scheme base • Data validation • Support Connection Pooling/Async IO Scheme Validator Model
  25. 25. MySQL • MySQL in node.js – MySQL Native module • Support Connection Pooling/Async IO
  26. 26. Socket.IO • Web push method 1. AJAX (Comet) upgrade 2. Web Socket – Similar to Streaming – Start from ws:// (not http://)
  27. 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. 28. Socket.IO • Server
  29. 29. Socket.IO • Client
  30. 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. 31. Socket.IO • ROOM (채널) – 채널 조인하기 : socket.join(“룸이름”) – 채널에서 나오기 : socket.leave(“룸이름”); – 룸안에 있는 소켓에 이벤트 보내기 io.sockets.in(“룸이름”).emit(“이벤트”,{메세지}); – 룸안에 있는 나를 제외한 소켓에 메세지 보내기 socket.brodcast.to(“룸이름”).emit(“이벤트”,{메세지}); – 현재 생성되어 있는 룸 이름 읽어오기 io.sockets.manager.rooms – 룸안에 있는 소켓 목록 리턴 io.sockets.client(“룸이름”);
  32. 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
  33. 33. 비동기 코딩 패턴 Serial Sequence PatternSync Code Parallel pattern CALLBACK HELL !!
  34. 34. 비동기 코딩 패턴 • Async 프레임웍을 이용한 단순화 – 흐름 제어 • Serial : 순차 실행 • Parallel : 병렬 실행 • Waterfall : 순차 실행, 전단계의 결과를 다음 단계로 넘김
  35. 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. 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. 37. Clustering • Clustering Module – 하나의 Machine에서 여러개의 Node.js 인스턴스를 띄울 수 있음 – 같은 포트로 Listen ※ 굳이 그래야 하나? 어짜피 로드밸런서를 둬야 하는데 • 다른 Cluster 구성 – Cluster 모듈 없이 앞단에 Reverse Proxy (LB)배치 – Session, Socket.IO Sharing은 Redis로
  38. 38. 모니터링 툴 • Appdyanmics 연계 시스템간의 성능 모니터링 가능 코드별 수행 시간 추적 가능
  39. 39. 모니터링 툴 • NewRelic Nodetime (얼마전에 AppDyamics에 인수됨) – 1 노드 모니터링 무료 구간별 소요시간 분석 가능
  40. 40. 기타 눈여겨 볼만한 모듈 • Passport : 인증 모듈,소셜 인증,Oauth,OpenID등 인증등 제공 • Winstone : 로깅 모듈
  41. 41. 2. Vert.x에 대한 간략한 소개
  42. 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. 43. Vert.x 개념 잡기 • Verticle – node.JS의 하나의 route 모듈과 같은 개념 (Servlet) – 독립적인 ClassLoader에 의해 로딩됨 (Isolation 됨) : 다른 Verticle과 공유되지 않기 때문에, 멀티 쓰레딩을 신경 쓸 필요가 없음
  44. 44. Vert.x 개념 잡기 • Worker Verticle – EventBus를 통해서 오는 작업을 뒷단에서 비동기 처리 – Thread Pool을 사용함
  45. 45. Vert.x 개념 잡기 • Event Bus – HazleCast 기반의 메세지 큐 (cf. node.js Redis) – 다른 서버로 이벤트가 들어오더라도, HazelCast에 의해서 해당 event handler가 있는 서버로 이벤트를 라우팅 해줌
  46. 46. Vert.x 개념 잡기 • Vert.x Instance – 하나의 JVM Process – 동시에 여러개의 Verticle을 수 행할 수 있음 – 동시에 여러개의 Event Loop Thread를 수행할 수 있음
  47. 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. 48. 주의 사항 • JVM 기반이기 때문에 GC가 발생함 – 특히 HazelCast를 남용하면, Full GC Time 문제가 발생 가능 – 상용 버전의 HazelCast의 경우 Direct Memory Access를 이용하 여, 최소한의 GC Time으로 사용이 가능함 – 여러 인스턴스로 나눠서 메모리를 작게 잡고, 부하를 분산 시켜, Full GC 소요 시간과, 발생 횟수를 줄여야 함
  49. 49. VS 3. node.js와 Vert.x 비교
  50. 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. 51. 결론 • Start up이나, B2C 서비스는 node.JS로 시작 – 자료 찾기 편리함 – 자주 죽어서 문제가 될 때면 돈 벌었음 (컨설팅 받으세요) • 기술력이 충분하고, 고성능,고안정 서비스가 필요할 경우 Vert.x 고려 – 기반 엔진 자체가 튼튼하기 때문에 높은 성능과 안정성 – 모듈들이 적고, 자료가 부족하기 때문에, 자체 기술력이 높아야 함

×