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

13,539 views
13,102 views

Published on

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

Published in: Technology
0 Comments
21 Likes
Statistics
Notes
  • Be the first to comment

No Downloads
Views
Total views
13,539
On SlideShare
0
From Embeds
0
Number of Embeds
5,136
Actions
Shares
0
Downloads
99
Comments
0
Likes
21
Embeds 0
No embeds

No notes for slide

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

  1. 1. Node.js의 의미와 자바의 대안
  2. 2. 유행
  3. 3. Node.js 코드 자바스크립트 모듈 콜백 소켓 !!! (이벤트 핸들러) 하지만 쉬워 보이는...
  4. 4. Node.js란? 자바스크립트로 고용량 서버 네트워크 서비나 애플리케이션을 작성할 수 있는 프레임워크 ● 자바스크립트 & 모듈화 (CommonJS) ● 비동기 I/O 추상화 ● 이벤트 기반 단일 쓰레드 동시성 처리 ● 웹 애플리케이션 프레임워크가 아님!! 기반 네트워크 프레임워크
  5. 5. C10K 문제 “이젠 웹 서버가 만 개의 클라이언트를 동시에 처리해야 할 때라고 생각하지 않나요? 무엇보다, 웹은 정말 큰 세상이 됐어요. 컴퓨터 가 처리할 수 있는 용량도 커졌고요.” ... “결국, 하드웨어는 이제 병목이 아니에요.” - 댄 케이글● 1999년 문서 작성 ( http://www.kegel.com/c10k.html )● CPU: 500MHz, RAM: 1G, 100Mbps x 6 = $3000● 아파치 Prefork 모드에서 MaxRequestWorkers 기본 최대값 256
  6. 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. 7. 쓰레드(& 프로세스) 포크 fork 쓰레드 = 경량 프로세스 프로세스 생성 메모리 안전성 코드 쓰레드 프로세스 느림 무거움 높음 스텍 PC 쓰레드 빠름 가벼움 낮음정적 데이터 쓰레드 스텍 PC 메모리를 차지함동적 데이터 ` ... 생성 비용 발생 (힙) 스텍 쓰레드 PC 컨텍스트 스위칭 비용 공유 메모리/자원 잠금 = 병목 (또는 데드락, 라이브락) 1G 메모리에서 쓰레드 개수 512 개 스텍 = 2M
  8. 8. 다중 쓰레드 방식 ` `
  9. 9. 이벤트 구동 방식` ` ` `
  10. 10. 이벤트 VS 쓰레드요청 1요청 2 Request readFile() Read이벤트쓰레드 &블럭 I/O
  11. 11. 이벤트의 특징● 동시 처리 작업량이 많을 수록 컨텍스트 스위칭 비용 절약 고속 웹 서버, 메시징 이벤트 ~= 비선점형 스케쥴링● 오랫동안 connection을 물고 있으면서 CPU보다 I/O 대기 시간이 길 수록 메모 리 절약 DB 중심 Ajax 서버, 네트워크 프록시, 채팅, 알림, 대용량 파일 업로드● 무상태이므로 쓰레드의 복잡성이 없음● 위 요인을 못 살릴 수록 node.js의 장점이 희미해짐
  12. 12. 초간단 웹서버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);
  13. 13. Node.js의 구조 왜 자바스크립트인가? "자바스크립트는 다른 동적 언어와 차별화되 노드 애플리케이션 JS 는 어떤 특성이 있다. 쓰레드란 개념이 없 다는 점이다. 자바스크립트의 동시성은 전적 으로 이벤트에 기반을 둔다" - Ryan Dahl Node Binding ● 클로저 지원 ● 비동기 처리에 익숙함 C Event ● 가장 많이 퍼진 언어 중 하나 V8 Loop ● 단순하다 (단일쓰레드 밖에 방법이 없음) ● 고속 V8 엔진 비동기 I/O
  14. 14. 왜 Node.js를... & Polyglot
  15. 15. Node.js 용도?● Websocket 서버 – 채팅, 알림● 파일 업로드 서버● 광고 서버● Real-Time data app - 웹 서버만 가능하지 않다● REST API, Ajax 서버
  16. 16. 자바와 연동 pub sub Node MQ Java sub pub Json/Http Node Java sub pub MQ
  17. 17. 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);
  18. 18. Node.java ?● Non-blocking I/O (NIO) server/Client framework● Reactor Pattern!!! = 비동기 이벤트 구동● TCP, UDP, HTTP, SSL/TLS● Websocket, Protobuf, RTSP● 단일 쓰레드 / 다중 쓰레드 지원● 자바!!!● Trustin Lee(aka 이희승)
  19. 19. httpserverpublic void messageReceived(ChannelHandlerContext ctx,MessageEvent e) throws Exception { HttpRequest request =(HttpRequest) e.getMessage(); buf.setLength(0); buf.append("Hello Universern"); ChannelBuffer content = request.getContent(); if (content.readable()) { buf.append("CONTENT: " + content.toString(CharsetUtil.UTF_8)); } writeResponse(e);}
  20. 20. Netty ++ ?● Javascript● 쉬운 비동기 이벤트 주도 방식● 단일 또는 다중 스레드● 자바 통합● JVM의 이식성, 안정성, 성능● 보다 많은 모듈● 독립 실행(platform) 뿐 아니라 내장(framework)도 가능
  21. 21. Vert.x● Javascript ( & Java, Ruby, Groovy, Scala, Clojure, Python...)● 비동기 이벤트 주도 방식 ( 단일 또는 다중 스레드 )● 수평 확장성: 분산 이벤트 버스● TCP, SSL, HTTP/HTTPS 버스 JS Ruby Java 모듈● WebSocket, SockJS● Jar로 내장 가능 = framework 분산 이벤트 버스 Core Netty
  22. 22. Web Server 예제자바스크립트 (아직)CommonJS가 아님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)
  23. 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. 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● 커뮤니티 전무
  25. 25. Vert.x를 기다릴 이유? Polyglot Software package metrics
  26. 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)

×