세션3 node.js의 의미와 자바의 대안
DESCRIPTION
node.js의 의미와 자바의 대안TRANSCRIPT
Node.js의 의미와 자바의 대안
유행
Node.js 코드자바스크립트
모듈
콜백(이벤트 핸들러)소켓 !!!
하지만 쉬워 보이는...
Node.js란?
● 자바스크립트 & 모듈화 (CommonJS)
● 비동기 I/O 추상화
● 이벤트 기반 단일 쓰레드 동시성 처리
● 웹 애플리케이션 프레임워크가 아님!! 기반 네트워크 프레임워크
자바스크립트로 고용량 서버 네트워크 서비나 애플리케이션을 작성할 수 있는 프레임워크
C10K 문제“이젠 웹 서버가 만 개의 클라이언트를 동시에 처리해야 할 때라고 생각하지 않나요? 무엇보다, 웹은 정말 큰 세상이 됐어요. 컴퓨터
가 처리할 수 있는 용량도 커졌고요.”...
“결국, 하드웨어는 이제 병목이 아니에요.” - 댄 케이글
● 1999년 문서 작성 ( http://www.kegel.com/c10k.html )
● CPU: 500MHz, RAM: 1G, 100Mbps x 6 = $3000
● 아파치 Prefork 모드에서 MaxRequestWorkers 기본 최대값 256
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
이걸 이벤트 구동 방식이라고 말해보죠
`
쓰레드(& 프로세스)
코드
스텍 PC
쓰레드
정적 데이터
동적 데이터(힙)
스텍 PC
쓰레드
스텍 PC
쓰레드
프로세스
포크
fork
...
쓰레드 = 경량 프로세스
생성 메모리 안전성
프로세스 느림 무거움 높음
쓰레드 빠름 가벼움 낮음
메모리를 차지함생성 비용 발생컨텍스트 스위칭 비용공유 메모리/자원 잠금 = 병목 (또는 데드락, 라이브락)
1G 메모리에서 쓰레드 개수 512 개스텍 = 2M
다중 쓰레드 방식
` `
이벤트 구동 방식
` `` `
이벤트 VS 쓰레드요청 1
요청 2
Request readFile() Read
이벤트
쓰레드 &블럭 I/O
이벤트의 특징● 동시 처리 작업량이 많을 수록 컨텍스트 스위칭 비용 절약
고속 웹 서버, 메시징이벤트 ~= 비선점형 스케쥴링
● 오랫동안 connection을 물고 있으면서 CPU보다 I/O 대기 시간이 길 수록 메모리 절약DB 중심 Ajax 서버, 네트워크 프록시, 채팅, 알림, 대용량 파일 업로드
● 무상태이므로 쓰레드의 복잡성이 없음
● 위 요인을 못 살릴 수록 node.js의 장점이 희미해짐
초간단 웹서버var http = require("http"), url = require("url"), path = require("path"), fs = require("fs"); http.createServer(function(request, response) { var uri = url.parse(request.url).pathname; var filename = path.join(process.cwd(), uri); path.exists(filename, function(exists) { if(!exists) { … } else { fs.readFile(filename, "binary", function(err, file){ response.sendHeader(200); response.write(file, "binary"); response.close(); }); } });}).listen(8080);
Node.js의 구조왜 자바스크립트인가?
"자바스크립트는 다른 동적 언어와 차별화되는 어떤 특성이 있다. 쓰레드란 개념이 없다는 점이다. 자바스크립트의 동시성은 전적으로 이벤트에 기반을 둔다" - Ryan Dahl
● 클로저 지원● 비동기 처리에 익숙함 ● 가장 많이 퍼진 언어 중 하나● 단순하다 (단일쓰레드 밖에 방법이 없음)● 고속 V8 엔진
V8EventLoop
Node Binding
노드 애플리케이션
C
JS
비동기 I/O
왜 Node.js를...
&Polyglot
Node.js 용도?● Websocket 서버 – 채팅, 알림
● 파일 업로드 서버
● 광고 서버
● Real-Time data app - 웹 서버만 가능하지 않다
● REST API, Ajax 서버
자바와 연동
Node JavaMQ
Node Java
MQ
Json/Http
pubsub
pub sub
pubsub
Redis를 사용한 연동자바redpub.publish("alert:" + id + ":update", updateCount);
노드var ws = require('./lib/ws'), redis = require("./lib/redis-client");
var pubsub = redis.createClient();var connect;pubsub.stream.addListener('connect', function() { pubsub.subscribeTo('alert:*:update', function(channel, data) { if (connect) { connect.write(data); } });}); …
var server = ws.createServer({}, httpServer);server.addListener("connection", function(conn){ connect = conn; conn.broadcast("<"+conn.id+"> connected"); …});server.addListener("close", function(conn){ conn.broadcast("<"+conn.id+"> disconnected");});server.listen(8000);
Node.java ?● Non-blocking I/O (NIO) server/Client framework
● Reactor Pattern!!! = 비동기 이벤트 구동
● TCP, UDP, HTTP, SSL/TLS
● Websocket, Protobuf, RTSP
● 단일 쓰레드 / 다중 쓰레드 지원
● 자바!!!● Trustin Lee(aka 이희승)
httpserverpublic void messageReceived(ChannelHandlerContext ctx, MessageEvent e) throws Exception { HttpRequest request =(HttpRequest) e.getMessage();
buf.setLength(0); buf.append("Hello Universe\r\n");
ChannelBuffer content = request.getContent(); if (content.readable()) { buf.append("CONTENT: " + content.toString(CharsetUtil.UTF_8)); } writeResponse(e);}
Netty ++ ?● Javascript
● 쉬운 비동기 이벤트 주도 방식
● 단일 또는 다중 스레드
● 자바 통합
● JVM의 이식성, 안정성, 성능
● 보다 많은 모듈
● 독립 실행(platform) 뿐 아니라 내장(framework)도 가능
Vert.x● Javascript ( & Java, Ruby, Groovy, Scala, Clojure, Python...)
● 비동기 이벤트 주도 방식 ( 단일 또는 다중 스레드 )
● 수평 확장성: 분산 이벤트 버스
● TCP, SSL, HTTP/HTTPS
● WebSocket, SockJS
● Jar로 내장 가능 = framework
Netty
분산 이벤트 버스
JS Ruby Java버스모듈
Core
Web Server 예제
자바스크립트load('vertx.js')vertx.createHttpServer().requestHandler(function(req) { req.response.sendFile('webroot/' + req.path);
}).listen(8080)
그루비vertx.createHttpServer().requestHandler { req -> req.response.sendFile "webroot/$req.uri"
}.listen(8080)
(아직)CommonJS가 아님 콜백!!
람다식
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); }}
익명 클래스
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-listhttps://github.com/purplefox/vert.x/wiki/Task-list
● 소심한 Node 호환 계층https://github.com/nelsonsilva/node.vert.x
● 커뮤니티 전무
Vert.x를 기다릴 이유?
Software package metrics
Polyglot
그럼 Node.js를 잊어?● Community & ecosystem
Express(sinatra for node.js)Socket.ioGeddy, RailwayJS(Rails for node.js)Cucumber.js, mocha, JASMINE
● MODULES!! https://github.com/joyent/node/wiki/Modulesmany pure JS async modules
눈에 띄게 많아지는 제 3자 모듈 목록
● 자바스크립트! “나도 할 수 있다, 서버 프로그래밍!”
● 7월 22일 현재 안전판 0.6.19(개발 0.7.12)