세션3 node.js의 의미와 자바의 대안

26
Node.js의 의미와 자바의 대안

Upload: jieun-lee

Post on 18-Dec-2014

8.933 views

Category:

Technology


11 download

DESCRIPTION

node.js의 의미와 자바의 대안

TRANSCRIPT

Page 1: 세션3 node.js의 의미와 자바의 대안

Node.js의 의미와 자바의 대안

Page 2: 세션3 node.js의 의미와 자바의 대안

유행

Page 3: 세션3 node.js의 의미와 자바의 대안

Node.js 코드자바스크립트

모듈

콜백(이벤트 핸들러)소켓 !!!

하지만 쉬워 보이는...

Page 4: 세션3 node.js의 의미와 자바의 대안

Node.js란?

● 자바스크립트 & 모듈화 (CommonJS)

● 비동기 I/O 추상화

● 이벤트 기반 단일 쓰레드 동시성 처리

● 웹 애플리케이션 프레임워크가 아님!! 기반 네트워크 프레임워크

자바스크립트로 고용량 서버 네트워크 서비나 애플리케이션을 작성할 수 있는 프레임워크

Page 5: 세션3 node.js의 의미와 자바의 대안

C10K 문제“이젠 웹 서버가 만 개의 클라이언트를 동시에 처리해야 할 때라고 생각하지 않나요? 무엇보다, 웹은 정말 큰 세상이 됐어요. 컴퓨터

가 처리할 수 있는 용량도 커졌고요.”...

“결국, 하드웨어는 이제 병목이 아니에요.” - 댄 케이글

● 1999년 문서 작성 ( http://www.kegel.com/c10k.html )

● CPU: 500MHz, RAM: 1G, 100Mbps x 6 = $3000

● 아파치 Prefork 모드에서 MaxRequestWorkers 기본 최대값 256

Page 6: 세션3 node.js의 의미와 자바의 대안

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

이걸 이벤트 구동 방식이라고 말해보죠

Page 7: 세션3 node.js의 의미와 자바의 대안

`

쓰레드(& 프로세스)

코드

스텍 PC

쓰레드

정적 데이터

동적 데이터(힙)

스텍 PC

쓰레드

스텍 PC

쓰레드

프로세스

포크

fork

...

쓰레드 = 경량 프로세스

생성 메모리 안전성

프로세스 느림 무거움 높음

쓰레드 빠름 가벼움 낮음

메모리를 차지함생성 비용 발생컨텍스트 스위칭 비용공유 메모리/자원 잠금 = 병목 (또는 데드락, 라이브락)

1G 메모리에서 쓰레드 개수 512 개스텍 = 2M

Page 8: 세션3 node.js의 의미와 자바의 대안

다중 쓰레드 방식

` `

Page 9: 세션3 node.js의 의미와 자바의 대안

이벤트 구동 방식

` `` `

Page 10: 세션3 node.js의 의미와 자바의 대안

이벤트 VS 쓰레드요청 1

요청 2

Request readFile() Read

이벤트

쓰레드 &블럭 I/O

Page 11: 세션3 node.js의 의미와 자바의 대안

이벤트의 특징● 동시 처리 작업량이 많을 수록 컨텍스트 스위칭 비용 절약

고속 웹 서버, 메시징이벤트 ~= 비선점형 스케쥴링

● 오랫동안 connection을 물고 있으면서 CPU보다 I/O 대기 시간이 길 수록 메모리 절약DB 중심 Ajax 서버, 네트워크 프록시, 채팅, 알림, 대용량 파일 업로드

● 무상태이므로 쓰레드의 복잡성이 없음

● 위 요인을 못 살릴 수록 node.js의 장점이 희미해짐

Page 12: 세션3 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);

Page 13: 세션3 node.js의 의미와 자바의 대안

Node.js의 구조왜 자바스크립트인가?

"자바스크립트는 다른 동적 언어와 차별화되는 어떤 특성이 있다. 쓰레드란 개념이 없다는 점이다. 자바스크립트의 동시성은 전적으로 이벤트에 기반을 둔다" - Ryan Dahl

● 클로저 지원● 비동기 처리에 익숙함 ● 가장 많이 퍼진 언어 중 하나● 단순하다 (단일쓰레드 밖에 방법이 없음)● 고속 V8 엔진

V8EventLoop

Node Binding

노드 애플리케이션

C

JS

비동기 I/O

Page 14: 세션3 node.js의 의미와 자바의 대안

왜 Node.js를...

&Polyglot

Page 15: 세션3 node.js의 의미와 자바의 대안

Node.js 용도?● Websocket 서버 – 채팅, 알림

● 파일 업로드 서버

● 광고 서버

● Real-Time data app - 웹 서버만 가능하지 않다

● REST API, Ajax 서버

Page 16: 세션3 node.js의 의미와 자바의 대안

자바와 연동

Node JavaMQ

Node Java

MQ

Json/Http

pubsub

pub sub

pubsub

Page 17: 세션3 node.js의 의미와 자바의 대안

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);

Page 18: 세션3 node.js의 의미와 자바의 대안

Node.java ?● Non-blocking I/O (NIO) server/Client framework

● Reactor Pattern!!! = 비동기 이벤트 구동

● TCP, UDP, HTTP, SSL/TLS

● Websocket, Protobuf, RTSP

● 단일 쓰레드 / 다중 쓰레드 지원

● 자바!!!● Trustin Lee(aka 이희승)

Page 19: 세션3 node.js의 의미와 자바의 대안

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);}

Page 20: 세션3 node.js의 의미와 자바의 대안

Netty ++ ?● Javascript

● 쉬운 비동기 이벤트 주도 방식

● 단일 또는 다중 스레드

● 자바 통합

● JVM의 이식성, 안정성, 성능

● 보다 많은 모듈

● 독립 실행(platform) 뿐 아니라 내장(framework)도 가능

Page 21: 세션3 node.js의 의미와 자바의 대안

Vert.x● Javascript ( & Java, Ruby, Groovy, Scala, Clojure, Python...)

● 비동기 이벤트 주도 방식 ( 단일 또는 다중 스레드 )

● 수평 확장성: 분산 이벤트 버스

● TCP, SSL, HTTP/HTTPS

● WebSocket, SockJS

● Jar로 내장 가능 = framework

Netty

분산 이벤트 버스

JS Ruby Java버스모듈

Core

Page 22: 세션3 node.js의 의미와 자바의 대안

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가 아님 콜백!!

람다식

Page 23: 세션3 node.js의 의미와 자바의 대안

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); }}

익명 클래스

Page 24: 세션3 node.js의 의미와 자바의 대안

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

● 커뮤니티 전무

Page 25: 세션3 node.js의 의미와 자바의 대안

Vert.x를 기다릴 이유?

Software package metrics

Polyglot

Page 26: 세션3 node.js의 의미와 자바의 대안

그럼 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)