Nodejs발표자료 - 팀 세미나용

28
Introduction to Nodejs [email protected] 전수현

Transcript of Nodejs발표자료 - 팀 세미나용

Page 1: Nodejs발표자료 - 팀 세미나용

Introduction to Nodejs

[email protected]전수현

Page 2: Nodejs발표자료 - 팀 세미나용

What is nodejs?

● Node.js® is a platform built on Chrome's JavaScript runtime

for easily building fast, scalable network applications. Node.js

uses an event-driven, non-blocking I/O model that makes it

lightweight and efficient, perfect for data-intensive real-time

applications that run across distributed devices.

Current Version: v0.12.2

Page 3: Nodejs발표자료 - 팀 세미나용

Nodejs 는 무엇인가?

● 서버 사이드 자바스크립트 기술.

● 기존의 자바스크립트들이 전부 브라우저에서 실행하는 형태였다면 node.js 는 서버사이드에서 실행되는 자바스크

립트. 그래서, 웹서버나 SMTP 서버 등과 같은 서버 프로그램을 작성할 수 있고, http://expressjs.com/ 와 같은 웹 프

레임워크도 있음

● node.js 장점

– V8 - 스크립트 처리하는 인터프리터 중 성능이 좋은 편. http://attractivechaos.github.com/plb/ 같은 것을 보면

(물론 실제 개발 시에는 언어 자체가 병목이 아닌 경우가 많습니다만) 일반 알고리즘 구현 시 V8 자체 퍼포먼스가

좋음. 성능이 어느정도 나오는 스크립트 언어라는 점은 확실히 장점이 됨

– 기본 처리가 비동기 방식. 물론 파이썬의 twisted(이벤트 기반의 네트워킹 엔진) 등이 있지만, 기본 처리들이 다

비동기여서, I/O 나 DB 질의 수행되는 라이브러리쪽까지 비동기 처리가 됨. 자바 보다는 느려도 적은 비용으로 중

간 성능을 낼 수 있다는 것은 장점

– Java Script 프론트엔드 개발자들이 직접 서버 개발을 하기 용이해짐. 또한, 서버-클라이언트가 한 언어로 유지

보수할 수 있음.

http://codingdojang.com/scode/265

Page 4: Nodejs발표자료 - 팀 세미나용

Nodejs 의 또 다른 장점

● 가볍다

● 빠르다

– 동시 접속 10만 ~ 25만명 성공(스프라이트를 전송하는 초당 20,000번 트래픽, CPU 점유율 5~40% 불과)

● http://blog.caustik.com/2012/04/08/scaling-node-js-to-100k-concurrent-connections/

● Apache에 비해 http 속도가 3배 빠르다

– http://zgadzaj.com/benchmarking-nodejs-basic-performance-tests-against-apache-php

● npm에 다양한 모듈이 존재한다(현재 53,919개)

● javascript로만 개발 가능하다

http://goo.gl/np0Aer

Page 5: Nodejs발표자료 - 팀 세미나용

Nodejs 단점

● 이제 겨우 Current version 이 v0.12.2(2015.04.03 기준)이다

– 최초 릴리즈 버전 node-v0.1.100.tar.gz(2011.8.24)

● 이벤트 구동 방식의 프로그래밍 구현이 쉽지 않다

● 실수로 동기 방식의 코드로 개발할 경우, 치명적인 성능 저하를 유발

할 수 있다

http://goo.gl/np0Aer

Page 6: Nodejs발표자료 - 팀 세미나용

Nodejs 들어가기 전 이것 부터 알고 가자

Page 7: Nodejs발표자료 - 팀 세미나용

비동기 프로그래밍의 이해

서버에서 IO를 처리하다가 지연이 발생하면 다른 요청들은 처리되지 못하고 계속 대기하는 현상이 발생. 대부분의 기업형

서버 플랫폼들은 이 문제를 해결하기 위하여 사용자의 요청을 쓰레드로 처리

http://www.nextree.co.kr/p7292/

Multi-Thread 서버의 요청 처리를 쓰레드에서 처리하도록 하여 병렬처리를 가능하도록 하는 방식. 쓰레드는 서버 CPU 자원을 시분할 형태로 나누어 가짐으로써 독립실행이 가능하며 다른 요청을 동시에 받을 수 있게 함. Multi-Thread 기반의 서버는 일반적으로 클라이언트의 요청마다 Thread를 발생시킴. 이 말은 동시 접속자 수가 많을 수록 Thread가 많이 발생한다는 의미이며 그만큼 메모리 자원도 많이 소모한다는 의미. 그러나 서버의 자원은 제한되어 있으므로 일정 수 이상의 Thread는 발생시킬 수 없음.

Multi-Thread 는 이런 근본적인 문제를 안고 있기 때문에 현장에서는 서버를 업그레이드 하거나 Load-Balancing 등으로 분산처리 함. 한편 Multi-Thread 방식은 각 Thread 간의 공유자원 접근시 신중해야 힘. 각 Thread는 독립적인 시점에서 동작하므로 공유자원에 대한 동기화 없이 접근하면 예기치 않은 결과가 나올 수 있음.

Multi-Thread

병렬처리의 대안 : 비동기 방식

Page 8: Nodejs발표자료 - 팀 세미나용

Nodejs의 비동기 처리

Node.js 는 비동기 IO를 지원하며 Single-Thread 기반으로 동작하는 서버이다. Node 서버는 비동기 방식으로 요청을 처리하므로 요청을 처

리하면서 다음 요청을 받을 수 있다. 또한 병렬처리를 Thread 로 처리하지 않으므로 Multi-Thread가 갖는 근원적인 문제에서 자유롭다.

http://www.nextree.co.kr/p7292/

Event Loop는 요청을 처리하기 위하여 내부적으로 약간의 Thread와 프로세스를 사용한다. 이는 Non-Blocking IO 또는 내부 처리를 위한 목적으로만 사용되지 요청 처리 자체를 Thread로 하지는 않는다. 따라서 Node 서버는 Multi-Thread 방식의 서버에 비하여 Thread 수와 오버헤드가 훨씬 적다.

이벤트를 처리하는 Event Loop는 Single-Thread 로 이루어져 있다. 즉 요청 처리는 하나의 Thread 안에서 처리된다는 의미이다. 그래서 이벤트 호출 측에는 비동기로 처리되지만 처리 작업 자체가 오래 걸린다면 전체 서버 처리에 영향을 준다.(이는 Node.js 의 치명적인 약점)

Page 9: Nodejs발표자료 - 팀 세미나용

Single-Thread 기반 비동기 처리

나 : 피자 헛뜨에 전화걸어, 피자 한 판을 주문한다.

(포테이토 피자에 갈릭치즈 토핑이랑 치즈크러스터, 모짜렐라 치즈까지 넣어주세염)

나 : 피자가 오는 30분 동안 간단히 베숙희 라빈스 아이스크림과 한라봉 3개를 먹는다.

나: 배달이 오면 피자를 먹는다. 나 혼자. (callback 함수 실행 : 저 혼자 다 먹었어요 뿌잉뿌잉)

Single-threadSingle-threadSingle-thread

나 : 피자 헛뜨에 전화걸어, 피자 한 판을 주문한다.

(포테이토 피자에 갈릭치즈 토핑이랑 치즈크러스터, 모짜렐라 치즈까지 넣어주세염)

나 : 피자가 오는 30분 동안 아무것도 하지 않고 숨만 쉬고 기다린다.

나: 배달이 오면 피자를 먹는다. 이 것도 나 혼자.

Multi-thread

Page 10: Nodejs발표자료 - 팀 세미나용

코드로 보는 동기/비동기 방식

http://www.nextree.co.kr/p7292/

동기방식

비동기방식

Page 11: Nodejs발표자료 - 팀 세미나용

그림으로 보는 동기/비동기 방식

http://www.toptal.com/nodejs/why-the-hell-would-i-use-node-js

Page 12: Nodejs발표자료 - 팀 세미나용

http://www.toptal.com/nodejs/why-the-hell-would-i-use-node-js

그림으로 보는 동기/비동기 방식

Page 13: Nodejs발표자료 - 팀 세미나용

Nodejs 참 좋은데.. 레퍼런스가 있나염?

Page 14: Nodejs발표자료 - 팀 세미나용

LinkedIn의 모바일 버전의 전체 서버가 nodejs로 개발되었다는 소문이..

http://venturebeat.com/2011/08/16/linkedin-node/

http://goo.gl/np0Aer

Page 15: Nodejs발표자료 - 팀 세미나용

PayPal Engineering 블로그

https://www.paypal-engineering.com/2013/11/22/node-js-at-paypal/

Double the requests per second vs. the Java application. This is even more interesting because our initial performance results were using a single core for the node.js application compared to five cores in Java. We expect to increase this divide further.

35% decrease in the average response time for the same page. This resulted in the pages being served 200ms faster— something users will definitely notice

Test suite using production hardware that tested the routes and collected data on throughput and response time.

Page 16: Nodejs발표자료 - 팀 세미나용

Nodejs의 올바른 사용

● Node.js 는 Google Chrome V8 엔진 기반으로 동작하며 내부의 Event Loop는 Single-Thread 기반에서 비동기 메시지

를 처리한다. 이러한 Event Loop는 고성능의 병렬처리를 보장하도록 설계되어 있다. 따라서 이벤트에 의해 처리해야 할

단위 작업이 아주 짧은 시간 안에 처리된다면 Node.js의 고성능의 장점을 극대화 할 수 있다.

만일 처리 작업이 CPU를 많이 소모한다든지 대용량 파일을 처리하는 작업이라면 Node.js 는 독약과도 같다. 그러나 IO

작업이 별로 없는 애플리케이션이나 단위 작업이 짧은 메시징 애플리케이션의 경우에는 Node.js는 고성능을 보장해준다.

한편 Node 애플리케이션 개발자가 처리 로직을 비동기로 하지 않고 동기방식으로 구성한다면 Node를 잘못 활용하는 결

과를 낳을 수 있다. 따라서 Node 애플리케이션은 가능한 한 전부 비동기로 처리해야 하며 Node 개발자는 비동기 프로그

래밍 방식에 익숙해져야 할 필요가 있다.

http://www.nextree.co.kr/p7292/

(참고) V8 - 스크립트 처리하는 인터프리터 중 성능이 좋은 편. http://attractivechaos.github.com/plb/ 같은 것을 보면 (물론 실제 개발 시에

는 언어 자체가 병목이 아닌 경우가 많습니다만) 일반 알고리즘 구현 시 V8 자체 퍼포먼스가 좋음. 성능이 어느정도 나오는 스크립트 언어라

는 점은 확실히 장점이 됨

Page 17: Nodejs발표자료 - 팀 세미나용

Installing Nodejs● Download

– https://nodejs.org/download/

● Installing package manager

– Setup with Ubuntu● curl -sL https://deb.nodesource.com/setup | sudo bash -

● sudo apt-get install -y nodejs

– Setup with Debian (as root):● apt-get install curl

● curl -sL https://deb.nodesource.com/setup | bash -

● apt-get install -y nodejs

● apt-get install -y build-essential (optional:install build tool)

– Run as root on RHEL, CentOS or Fedora● curl -sL https://rpm.nodesource.com/setup | bash -

● yum install -y nodejs

● yum install gcc-c++ make (optional : install build too)

● # or: yum groupinstall 'Development Tools'

https://github.com/joyent/node/wiki/Installing-Node.js-via-package-manager

Page 18: Nodejs발표자료 - 팀 세미나용

Installing Nodejs

● Git clone & run the following commands– git clone git://github.com/ry/node.git

– cd node

– ./configure

– make

– sudo make install

● License– MIT license 와 다른 번들 OSS components libs의 license

● Prerequisites(Unix only)– GCC 4.2 or newer

– G++ 4.2 or newer

– Python 2.6 or 2.7

– GNU Make 3.81 or newer

– libexecinfo (FreeBSD and OpenBSD only)

http://howtonode.org/how-to-install-nodejs

Page 19: Nodejs발표자료 - 팀 세미나용

Installing Dependency Libraries

npm(Node Packaged Modules) is the package manager for javascript

IMPORTANT!

You need node v0.8 or higher to run this program(npm 의 경우 node.js 설치시 자동으로 설치)

Page 20: Nodejs발표자료 - 팀 세미나용

Npm Command

Page 21: Nodejs발표자료 - 팀 세미나용

Npm Command

Page 22: Nodejs발표자료 - 팀 세미나용

Installing Dependency Libraries

● Global install– # npm install -g <package_name>

● Local install– $ npm install <package_name>

– $ npm install <package_name>@<version>

● Check installed list– $ npm list installed

● Remove– $ npm uninstall <pakcage_name>

● Update– $ npm update <pakcage_name>

● Latest version check– $ npm update <pakcage_name>

Page 23: Nodejs발표자료 - 팀 세미나용

One stop Installing Dependency Libraries

● Define to package.json– name

– version

– main

– dependencies

– devDependencies

– engines

– scripts

– private

● Npm install

Page 24: Nodejs발표자료 - 팀 세미나용

Hello, Nodejs!

● HTTP server

Page 25: Nodejs발표자료 - 팀 세미나용

Do you alive? Nodejs

● crontab과 curl을 이용하여 nodejs 서버 체크 가능

– crontab -e

● curl로 특정시간 node server를 체크한 후 response를 분석하여 server가 오류인지 아닌지 판단

Page 26: Nodejs발표자료 - 팀 세미나용

Nodejs in github.com

● nodejs 확장 프로젝트는 전세계적으로 굉장히 빠르게 진행되고 있고 npm 모듈도 꾸준히 추가되고 있다.

Page 27: Nodejs발표자료 - 팀 세미나용

다음 시간에는...

● Nodejs 예외처리 (forever)● Nodejs 내장 디버거 (node-inspector)● Heroku (nodejs를 클라우드로 설치하여 운용할 수

있는 플랫폼)

Page 28: Nodejs발표자료 - 팀 세미나용

EOF