3. Node.js 코드
자바스크립트
모듈
콜백
소켓 !!! (이벤트 핸들러)
하지만 쉬워 보이는...
4. Node.js란?
자바스크립트로 고용량 서버 네트워크 서비나
애플리케이션을 작성할 수 있는 프레임워크
● 자바스크립트 & 모듈화 (CommonJS)
● 비동기 I/O 추상화
● 이벤트 기반 단일 쓰레드 동시성 처리
● 웹 애플리케이션 프레임워크가 아님!! 기반 네트워크 프레임워크
5. C10K 문제
“이젠 웹 서버가 만 개의 클라이언트를 동시에 처리해야 할 때라고
생각하지 않나요? 무엇보다, 웹은 정말 큰 세상이 됐어요. 컴퓨터
가 처리할 수 있는 용량도 커졌고요.”
...
“결국, 하드웨어는 이제 병목이 아니에요.” - 댄 케이글
● 1999년 문서 작성 ( http://www.kegel.com/c10k.html )
● CPU: 500MHz, RAM: 1G, 100Mbps x 6 = $3000
● 아파치 Prefork 모드에서 MaxRequestWorkers 기본 최대값 256
6. C10K 문제
● 클라이언트 제어
● one process for each client (classic Unix approach)
● one OS-level thread: many clients
– a user-level thread (classic Java green threads)
– a state machine
이걸 이벤트 구동 방식이라고 말해보죠
– a continuation
● one OS-level thread for each client (Java native threads)
● one OS-level thread for each active client
● 비동기 I/O
7. 쓰레드(& 프로세스)
포크
fork
쓰레드 = 경량 프로세스
프로세스
생성 메모리 안전성
코드 쓰레드
프로세스 느림 무거움 높음
스텍 PC
쓰레드 빠름 가벼움 낮음
정적 데이터
쓰레드
스텍 PC 메모리를 차지함
동적 데이터 ` ... 생성 비용 발생
(힙)
스텍
쓰레드
PC
컨텍스트 스위칭 비용
공유 메모리/자원 잠금
= 병목 (또는 데드락, 라이브락)
1G 메모리에서 쓰레드 개수 512 개
스텍 = 2M
10. 이벤트 VS 쓰레드
요청 1
요청 2
Request readFile() Read
이벤트
쓰레드 &
블럭 I/O
11. 이벤트의 특징
● 동시 처리 작업량이 많을 수록 컨텍스트 스위칭 비용 절약
고속 웹 서버, 메시징
이벤트 ~= 비선점형 스케쥴링
● 오랫동안 connection을 물고 있으면서 CPU보다 I/O 대기 시간이 길 수록 메모
리 절약
DB 중심 Ajax 서버, 네트워크 프록시, 채팅, 알림, 대용량 파일 업로드
● 무상태이므로 쓰레드의 복잡성이 없음
● 위 요인을 못 살릴 수록 node.js의 장점이 희미해짐
13. Node.js의 구조
왜 자바스크립트인가?
"자바스크립트는 다른 동적 언어와 차별화되
노드 애플리케이션 JS
는 어떤 특성이 있다. 쓰레드란 개념이 없
다는 점이다. 자바스크립트의 동시성은 전적
으로 이벤트에 기반을 둔다" - Ryan Dahl
Node Binding ● 클로저 지원
● 비동기 처리에 익숙함
C
Event
● 가장 많이 퍼진 언어 중 하나
V8 Loop ● 단순하다 (단일쓰레드 밖에 방법이 없음)
● 고속 V8 엔진
비동기 I/O
20. Netty ++ ?
● Javascript
● 쉬운 비동기 이벤트 주도 방식
● 단일 또는 다중 스레드
● 자바 통합
● JVM의 이식성, 안정성, 성능
● 보다 많은 모듈
● 독립 실행(platform) 뿐 아니라 내장(framework)도 가능
21. Vert.x
● Javascript ( & Java, Ruby, Groovy, Scala, Clojure, Python...)
● 비동기 이벤트 주도 방식 ( 단일 또는 다중 스레드 )
● 수평 확장성: 분산 이벤트 버스
● TCP, SSL, HTTP/HTTPS 버스 JS Ruby Java
모듈
● WebSocket, SockJS
● Jar로 내장 가능 = framework 분산 이벤트 버스
Core Netty
23. Web Server 예제
import org.vertx.java.core.Handler;
import org.vertx.java.core.http.HttpServerRequest;
import org.vertx.java.deploy.Verticle;
public class Server extends Verticle {
public void start() {
vertx.createHttpServer().requestHandler(
new Handler<HttpServerRequest>() {
익명 클래스 public void handle(HttpServerRequest req) {
req.response.sendFile("webroot/"+req.path);
}
}).listen(8080);
}
}
24. Vert.x의 상황
● Vert.x 1.1.0 출시 (너무 급했음)
● 빈약한 기본 제공 모듈
Web Server, MonogoDB, Mailer, Auth, Work Queue
● 그리고, 자극적인 밴치마크와
http://vertxproject.wordpress.com/2012/05/09/vert-x-vs-node-js-simple-http-benchmarks/
● 하고 싶은 것들...
https://github.com/purplefox/vert.x/wiki/Modules-&-Features-wish-list
https://github.com/purplefox/vert.x/wiki/Task-list
● 소심한 Node 호환 계층
https://github.com/nelsonsilva/node.vert.x
● 커뮤니티 전무
26. 그럼 Node.js를 잊어?
● Community & ecosystem
Express(sinatra for node.js)
Socket.io
Geddy, RailwayJS(Rails for node.js)
Cucumber.js, mocha, JASMINE
● MODULES!! https://github.com/joyent/node/wiki/Modules
many pure JS async modules
눈에 띄게 많아지는 제 3자 모듈 목록
● 자바스크립트! “나도 할 수 있다, 서버 프로그래밍!”
● 7월 22일 현재 안전판 0.6.19(개발 0.7.12)