W ha tis


    SpringSproutSwagger
         2011.01.29
          Outsider
node.jsis
Server-side
JavaScript
“노드가아직은서버사이드
자바스크립트의개념을취한
많은것들중하나로보이지만


                                                          ”
 그것들보다훨씬흥미롭다.

                SimonWillison




                             http://simonwillison.net/2009/Nov/23/node/
Motivation
I/O는다르게
수행되어야한다.
varresult=db.query('select*fromA')
//useresult
varresult=db.query('select*fromA')
//useresult



          왜기다려야하는가?
I/Olatency

     L1                                                                   1ns
     L2                                                              4.7ns
  RAM                                                                 83ns
  DISK                                         13,700,000ns
Internet                                       80,000,000ns
            http://duartes.org/gustavo/blog/post/what-your-computer-does-while-you-wait
싱글쓰레드를이용한
EventLoop가
        더낫다
db.query('select*fromA',
function(result){
//useresult
}
);
동시접속수에따른초당리퀘스트처리수
초당리퀘스트
12,000


                                                                   nginx
 9,000



 6,000

                                              apache
 3,000



     0
         0       500   1000   1500   2000        2500       3000        3500      4000
                                                                               동시접속수

                                     http://blog.webfaction.com/a-little-holiday-present
동시접속수에따른메모리사용량
MB
 40
                                        apache
 30



 20



 10

                                                             nginx
  0
      0   500   1000   1500   2000        2500       3000        3500   4000
                                                                     동시접속수

                              http://blog.webfaction.com/a-little-holiday-present
왜모두EventLoop를
    사용하지않는가?
문화적인이유
우리가
I/O를
그렇게
배웠다
puts('이름을입력하세요:');

varneme=gets();

puts('이름:'+name);
puts('이름을입력하세요:');

gets(function(name){
puts('이름:'+name);
});

                어렵다어려워
인프라적인이유
SingleThreadEventLoop는
non-blockingI/O가필요하다.
대부분의라이브러리가
non-blockingI/O를
지원하지않았다
현재는많은인프라가
 갖추어져있다.
   예:Twisted,eventmachine
블락킹I/O와
넌블락킹I/O를
  섞어서
사용하는것이
  어렵다
EventLoop와non-blockingI/O에대한
               전문지식이필요하다
JavaScript
유니버셜랭귀지
EventLoop를
 사용하도록
디자인되었다
성능을위한
경쟁이붙었다
이제다시....
RyanDahl

09.02.09
V8에기반한프로젝트
아이디어에대한글을올림

09.02.15
Github에프로젝트시작

09.11.08
JSConf.eu2009발표
(v0.1.16)

11.01
현재-v0.2.6,0.3.7
CommonJS기반
JavaScript는더이상
브라우저를위한것이아니다.


                      CommonJS기반
KevinDangoor가만든
  웹브라우저이외의환경에서
JavaScript를사용하기위한스펙

  Modules,System,Filesystem,UnitTesting




                                            CommonJS기반
node.js
 CouchDB
  RingoJS
SproutCore


            CommonJS기반
에서  동작
V 8위
C/C++애드온
직접짠코드외에는
  모두비동기
모두
non-blockingI/O
단하나의쓰레드
 단하나의스택
index.html페이지요청




    node
execution
    stack
                    ev_loop()
index.html페이지요청




                    socket_readable(1)
    node
execution
    stack
                        ev_loop()
index.html페이지요청



                      http_parse(1)
                    socket_readable(1)
    node
execution
    stack
                        ev_loop()
index.html페이지요청

                    load(“index.html”)
                      http_parse(1)
                    socket_readable(1)
    node
execution
    stack
                        ev_loop()
index.html페이지요청



                      http_parse(1)
                    socket_readable(1)
    node
execution
    stack
                        ev_loop()
index.html페이지요청




                    socket_readable(1)
    node
execution
    stack
                        ev_loop()
index.html페이지요청




    node
execution
    stack
                    ev_loop()
메모리에대한두번째요청




    node
execution
    stack
                         ev_loop()
메모리에대한두번째요청




                    socket_readable(2)
    node
execution
    stack
                         ev_loop()
메모리에대한두번째요청



                      http_parse(2)
                    socket_readable(2)
    node
execution
    stack
                         ev_loop()
메모리에대한두번째요청

                     http_respond(2)
                      http_parse(2)
                    socket_readable(2)
    node
execution
    stack
                         ev_loop()
메모리에대한두번째요청



                      http_parse(2)
                    socket_readable(2)
    node
execution
    stack
                         ev_loop()
메모리에대한두번째요청




                    socket_readable(2)
    node
execution
    stack
                         ev_loop()
메모리에대한두번째요청




    node
execution
    stack
                         ev_loop()
index.html요청에대한응답




    node
execution
    stack
                      ev_loop()
index.html요청에대한응답




                    file_loaded()
    node
execution
    stack
                      ev_loop()
index.html요청에대한응답



                    http_respond(1)
                     file_loaded()
    node
execution
    stack
                       ev_loop()
index.html요청에대한응답




                    file_loaded()
    node
execution
    stack
                      ev_loop()
index.html요청에대한응답




    node
execution
    stack
                      ev_loop()
은가 ?
         엇이 좋
무
이좋 고 빠르다
성능
RealtimeApp에좋다
100동시접속에1MB응답

node822req/sec
nginx708req/sec
thin85req/sec
mongrel4req/sec

                                                                                                                 (클수록좋다)
                                   http://chetansurpur.com/blog/2010/10/why-node-js-is-totally-awesome.html
다른기술과
함께쓸수있다
가쉽 다
 작 하 기
시
“
  node.js는
내가똑똑한것처럼


                                                   ”
느끼게만들어준다

          TobieLagel



               http://twitter.com/#!/tobie/status/8975802142031872
단점은?
아직어리다
멀티CPU/데이터센터간의

   확장성문제
간단한예제들
     fromryan
   node.jsv0.2.6
//helloworld.js
varsys=require('sys')

setTimeout(function(){
sys.puts('world');
},2000);

sys.puts('hello');
//forever_helloworld.js
varputs=require('sys').puts;

setInterval(function(){
puts('hello');
},500);

process.on('SIGINT',function(){
puts('good-bye');
process.exit(0);
});
//tcp.js
vartcp=require('net');

varserver=tcp.createServer();

server.on('connection',function(e){
e.write('hello!n');
e.end();
});
server.listen(8000);
//fileio.js
varstat=require('fs').stat,
puts=require('sys').puts;

stat('/etc/passwd',
function(err,data){
if(err)throwerr;
puts('modified:'+data.mtime);
}
);
//streamhttp.js
varhttp=require('http');

http.createServer(function(req,res){
res.writeHead(200,
{'Content-Type':'text/html'});
res.write('Hellon');

setTimeout(function(){
res.write('world!n');
res.end();
},2000);
}).listen(8000);
//watchfile.js
varfs=require('fs'),
puts=require('sys').puts;

fs.watchFile('./test.txt',
function(){
puts('파일을바꾸셨군요.');
process.exit(0);
});
node.js는서비스할
 준비가되었는가?
“node.js는
무시하기에는
너무쿨하다
            DustinMcQuay
                                                  ”
http://www.synchrosinteractive.com/blog/9-nodejs/22-nodejs-has-a-bright-future
Questions...?

Blog:http://blog.outsider.ne.kr
Twitter:@outsider__
email:outsideris@gmail.com
사진출처(underCCL)

    http://www.flickr.com/photos/41534655@N00/220318384/
    http://www.flickr.com/photos/blank22763/4089949526/
    http://www.flickr.com/photos/arthurjohnpicton/4383221264/
    http://www.flickr.com/photos/75898532@N00/3110092806/
    http://www.flickr.com/photos/f-l-e-x/3092386087/
    http://www.flickr.com/photos/chefranden/4596604619/
    http://www.flickr.com/photos/tjook/5111553020/
    http://www.flickr.com/photos/franksvalli/5163205409/
    http://www.flickr.com/photos/rawryder/5086090931/
    http://www.flickr.com/photos/elvinj/4487097018/
    http://www.flickr.com/photos/ramdac/373881476/
    http://www.flickr.com/photos/gregw/3592153959/

What is nodejs