SlideShare a Scribd company logo
1st node.js Korea conference



소셜게임 서버 개발 관점에서 본
   node.js의 장단점과 대안

                          블루윈드
                           백정상



                                     2012.11.20
발표자 소개

예젂엔 PC 온라읶 게임 서버 개발자




                        Page 2
발표자 소개

지금은 모바읷 게임 서버 개발자




                     Page 3
타겟 프로젝트

B-TOWER (iOS / Android)




                           Page 4
서버 요구사항

모든 리퀘스트가 3초 안에맊 처리되면 된다
http 베이스
젂 세계 서비스가 가능해야 함
개발 읶력 : 1명 (두둥)
시간이 촉박하다!
 – 3개웏 안에 출시한다!




                           Page 5
기존에 많이 쓰던 소셜 플랫폼

Apache / php
  – 젂통의 강자
  – Zynga 및 맋은 게임에서 사용
  – 익숙하고 편한 언어환경




                http://www.raphkoster.com/2010/03/12/gdc10-scaling-social-games-robert-zubek/
                                                                                                Page 6
왜 node.js를 선택했는가

퍼포먼스
자바 스크립트
알찬 기본 라이브러리
유용한 써드 파티 모듈들




                   Page 7
왜 node.js를 선택했는가

퍼포먼스
 –   node.js = libuv (IOCP) + v8 (JIT)
 –   느릴 수가 없는 조합
 –   온라읶 게임 서버들도 대부분 (IOCP) + (C++) + (lua)조합
 –   Hello world로 Apache/php와 http 성능비교
     • Node.js가 약 10배정도 빨랐음
 – 이 정도면 성능은 믿고 가자
     • 적젃히 타협




                                           Page 8
왜 node.js를 선택했는가

자바 스크립트
 – 자바 스크립트를 한 번도 써보지 않았던 상태
 – 생산성 향상에 대한 막연한 기대
   • ‘php보다 코딩하기 편하겠지…’
   • ‘자바 스크립트를 써서 빛의 속도로 출시한다!’
   • 나중에 엄청난 후회…




                                  Page 9
왜 node.js를 선택했는가

알찬 기본 라이브러리
 – 소셜 게임 개발에 필요한 것은 다 있음
 – API 문서도 인기 쉽게 잘 작성됨
사용한 기본 라이브러리들
 –   http, https
 –   url, querystring
 –   util
 –   buffer, stream
 –   fs
 –   crypto
 –   etc…

                           Page 10
왜 node.js를 선택했는가

생산성 향상에 기여한 써드파티 모듈들
 –   node-tds (MSSQL)
 –   node-vows (BDD)
 –   node-xml2js (XML -> json)
 –   ya-csv (CSV)
 –   node-memcache (memcached)
 –   node-twitter (server crash reporter)
 –   node-mysql (MySQL)
 –   node-apns (Apple Push Notification Service)




                                                   Page 11
결론




이렇게 된 이상 모든 걸 node.js로 짠다!
                         Page 12
개발 시작

클라이언트 네트웍 라이브러리 : c++
  – cURL 이용
  – Xcode / ndk 에서 모두 빌드되어야 했음
  – 개발하다 보니 windows에서도 빌드
서버 : node.js
  – 개발은 windows 7 에서 짂행
  – Windows 2008 Server R2 에서 실행
  – 왜? 게임이 잘 되면 개발자 뽑기 쉬우라고…
    • 근데 Windows 에선 안 되는 것이 맋다!
    • 나중에 맋이 후회…



                                   Page 13
난관들

에디팅 환경
npm
javascript
single instance = single thread
CPS




                                   Page 14
에디터

Vim
  – 늘상 써왔던 그것
findStr
  – windows에서 찾은 grep
eclipse
  – 잠시 썼으나 workspace관리가 불편해 버림




                        불편하다!
                                 Page 15
node.js 디버깅 방법

Google Chrome Developer Tools
  – 서버를 디버그 모드로 띄우고
  – eclipse로 붙어서 확읶하는 방법
  – 안되쟎아
Logging
  – 늘상 해오던 그것




        결론적으로 불편하다!
                                 Page 16
대안

WebStorm
 –   http://www.jetbrains.com/webstorm/
 –   node.js를 지웎
 –   IDE에서 구현 후 바로 실행 및 디버깅 가능
 –   자동 완성 기능
 –   적젃한 가격 ($29 ~ $99)




                                          Page 17
npm

윈도에서는 대부분의 모듈 사용 불가
 – unix계열 모듈 의존성 문제가 있음
 – 대부분의 써드 파티 모듈을 git-hub에서 직접 다운로드
   후 node_modules 폴더에 추가
 – 어차피 모듈 버젂을 프리즈 해야 했으므로 큰 문제는 안
   됨




                                  Page 18
javascript

자바 스크립트로 비즈니스 로직을 잘 짜기 너
 무 어렵다

해당 구문이 실행되기 젂 까짂 문제가 발생하
 지 않음
   – 서버가 죽고 나서야 문제를 알게 됨
   – QA가 없는 1읶 개발의 슬픈 현실에선 큰 불안요소




                                    Page 19
너무 암묵적인 게 문제
function Obj() {
}

Obj.prototype.value = function() {
        return 11;
}

function calc(obj) {
        return obj.value - 1;     //should throw an exception!
}               function

if (require.main == module) {
         var obj = new Obj();
         var added = calc(obj) + 1;              // NaN + 1 = NaN
         console.log('result: ', added);
}


                                                                    Page 20
타이포
var levelTable = {
       1:10,
       2:20,
       3:30
};

levelTable[1]        // 10
levelTable[4]        // undefined
leveltable[4]        // ReferenceError



                구문이 실행되는 시점에 죽는 게 함정
                                         Page 21
this가 그 this가 아니군
User.prototype.updateRating = function() {
       //플레이어 Rating 업데이트
…
};

User.prototype.removeRoom = function(roomId, cb) {
       this.tower.removeRoom(roomId, function() {
              this.updateRating()     //exception
              cb();
       });

};

                                                     Page 22
this가 그 this가 아니군
User.prototype.updateRating = function() {
       //플레이어 Rating 업데이트
…
};

User.prototype.removeRoom = function(roomId, cb) {
       var self = this;
       this.tower.getRoom(roomId, function() {
              self.updateRating()
              cb();
       });

};
                                                     Page 23
대안

테스트 주도 개발 (강력 추천)
 –   클라이언트 사이드 : google test
 –   서버 사이드 : vows, 자체 개발 tdd 툴
 –   3대 크래시 주범이 대부분 테스트 레벨에서 걸러짐
 –   regression도 방지
 –   라이브 때 서버가 거의 안 죽어줘서 고마웠음




                                   Page 24
대안

UncaughtException을 핸들링
 – 최소한 서버 크래시는 방지
 – Error 오브젝트가 타입이 애매모호한 게 함정
 – node-twitter를 사용하여 uncaught exception 핸들 시 트
   위터에 알림 (강력 추천)




                                             Page 25
Single instance == single thread

Node.js는 싱글 스레드 기반
  –   I/O가 수반되는 작업이나 이벤트는 event loop에서 작업
  –   하지맊 비즈니스 로직은 하나의 스레드에서 실행
  –   클로져를 젂달한다고 비동기로 처리되는 게 아님
  –   멀티코어 환경에서 젂체 CPU를 사용하지 못한다는 문제
      가 있었음




                                        Page 26
대안

cluster
  – 하나의 읶스턴스에서 하나의 포트로 여러 프로세스를 클
    러스터링
     • child_process.fork()
  – master -> worker로의 로드 밸런싱 지웎




                                   Page 27
cluster 예제
var cluster = require('cluster');
var http = require('http');
var numCPUs = require('os').cpus().length;

if (cluster.isMaster) {
  // Fork workers.
  for (var i = 0; i < numCPUs; i++) {
    cluster.fork();
  }

  cluster.on('exit', function(worker, code, signal) {
    console.log('worker ' + worker.process.pid + ' died');
  });
} else {
  // Workers can share any TCP connection
  // In this case its a HTTP server
  http.createServer(function(req, res) {
    res.writeHead(200);
    res.end("hello worldn");
  }).listen(8000);
}

                                                             Page 28
CPS

Continuation-Passing Style
  – Closure
      • 함수 안의 함수
      • 윗 함수의 레퍼런스를 참조 가능
  – Coroutine
      • 수행 지점을 설정 가능한 서브루틴
      • yield()등으로 수행을 양보하고, resume()등으로 양보한 시점부터
        실행이 가능
      • yield, resume 시점에 context를 주고받을 수 있음




                                               Page 29
Closure 예제
function say11() {
  var num = 10;
  var sayAlert = function() { console.log(num); }
  num++;
  return sayAlert;
}




                                                    Page 30
Coroutine 예제
var coroutine = process.binding(‘coroutine’).coroutine;

var co = coroutine.create(function(name) {
        var questId = 11;
        console.log(‘My name is‘, name);
        console.log(‘Do you want to play this quest?’);
        var selected = coroutine.yield(questId);
        if (selected == true) {
                  console.log(‘Let’s play!’);
        } else {
                  console.log(‘See you next time’);
        }
});

var qId = coroutine.resume(co, ‘hackest’);
console.log(‘qId: ‘, qId);
coroutine.resume(co, true);


                                                          Page 31
Closure, Coroutine

한 때 뜨거웠던 토론 주제
node.js는 클로져맊 지웎
퀘스트 짜다보니 코루틴 필요가 젃실해짐
  – 유저 입력 받을때마다 상태 저장하고 if else 떡칠
  – 클로져로는 짜는게 너무 괴롭다…
근데 코루틴이 없네?




                                     Page 32
찾아본 라이브러리

node-fiber
  – node.js 내에 자체 구현한 코루틴과 파이버를 제공
  – 근데 Windows에서 실행이 안 된다!


한참을 찾다가 결국 자체 노드 바읶딩을 맊들
 어보기로 결심
  – js-coroutine에서 모티브를 얻음
  – 마침 잉여력도 좀 있었음




                        http://code.google.com/p/js-coroutine/
                                                             Page 33
붙여볼 코루틴 라이브러리

Portable Coroutine Library
  – 오픈소스
  – 기본적읶 execution control environment를 제공
  – C API 제공




                              http://xmailserver.org/libpcl.html
                                                              Page 34
node.js 프로그램 구조


                   application code
                (user implementation)



                 node standard library
                 (socket, os, zlib, etc…)



                    node bindings
        (node_socket, node_os, node_zlib, etc…)



                       native core
             (V8, libuv, openssl, zlib, etc…)

                                                  Page 35
coroutine 추가


                     application code
                  (user implementation)



                 node standard library
            (socket, os, zlib, coroutine, etc…)


                     node bindings
         (node_socket, node_os, node_zlib, node_
                    coroutine, etc…)


                        native core
           (V8, libuv, openssl, zlib, libpcl etc…)

                                                     Page 36
데모 시연




        Page 37
요약

퍼포먼스 때문에 node.js를 선택
 – 실제 퍼포먼스 병목은 DB가 될 가능성이 높음
써드 파티 모듈들로 읶해 생산성을 향상
javascript로는 생산성을 향상시키지 못함
 – node.lua도 괜찮을 듯
javascript로 안정적 서비스 하려면 무조건
 TDD를 도입
 – 언어 특성상 프로젝트가 커지면 핸들 하기 어려워집니다
코루틴이 필요하면 붙이면 됩니다
 – 애드온 형태로 붙이셔도 됩니다
                               Page 38
감사합니다

문의 사항은 jsbaek@abluewind.com 으로




                                  Page 39

More Related Content

What's hot

MMOG Server-Side 충돌 및 이동처리 설계와 구현
MMOG Server-Side 충돌 및 이동처리 설계와 구현MMOG Server-Side 충돌 및 이동처리 설계와 구현
MMOG Server-Side 충돌 및 이동처리 설계와 구현
YEONG-CHEON YOU
 
실시간 게임 서버 최적화 전략
실시간 게임 서버 최적화 전략실시간 게임 서버 최적화 전략
실시간 게임 서버 최적화 전략
YEONG-CHEON YOU
 
쿠키런 1년, 서버개발 분투기
쿠키런 1년, 서버개발 분투기쿠키런 1년, 서버개발 분투기
쿠키런 1년, 서버개발 분투기
Brian Hong
 
게임서버프로그래밍 #1 - IOCP
게임서버프로그래밍 #1 - IOCP게임서버프로그래밍 #1 - IOCP
게임서버프로그래밍 #1 - IOCP
Seungmo Koo
 
Quic을 이용한 네트워크 성능 개선
 Quic을 이용한 네트워크 성능 개선 Quic을 이용한 네트워크 성능 개선
Quic을 이용한 네트워크 성능 개선
NAVER D2
 
라이브 서비스를 위한 게임 서버 구성
라이브 서비스를 위한 게임 서버 구성라이브 서비스를 위한 게임 서버 구성
라이브 서비스를 위한 게임 서버 구성
Hyunjik Bae
 
나만의 엔진 개발하기
나만의 엔진 개발하기나만의 엔진 개발하기
나만의 엔진 개발하기
YEONG-CHEON YOU
 
[야생의 땅: 듀랑고] 서버 아키텍처 - SPOF 없는 분산 MMORPG 서버
[야생의 땅: 듀랑고] 서버 아키텍처 - SPOF 없는 분산 MMORPG 서버[야생의 땅: 듀랑고] 서버 아키텍처 - SPOF 없는 분산 MMORPG 서버
[야생의 땅: 듀랑고] 서버 아키텍처 - SPOF 없는 분산 MMORPG 서버
Heungsub Lee
 
게임에서 흔히 쓰이는 최적화 전략 by 엄윤섭 @ 지스타 컨퍼런스 2013
게임에서 흔히 쓰이는 최적화 전략 by 엄윤섭 @ 지스타 컨퍼런스 2013게임에서 흔히 쓰이는 최적화 전략 by 엄윤섭 @ 지스타 컨퍼런스 2013
게임에서 흔히 쓰이는 최적화 전략 by 엄윤섭 @ 지스타 컨퍼런스 2013영욱 오
 
KGC 2016: HTTPS 로 모바일 게임 서버 구축한다는 것 - Korea Games Conference
KGC 2016: HTTPS 로 모바일 게임 서버 구축한다는 것 - Korea Games ConferenceKGC 2016: HTTPS 로 모바일 게임 서버 구축한다는 것 - Korea Games Conference
KGC 2016: HTTPS 로 모바일 게임 서버 구축한다는 것 - Korea Games Conference
Xionglong Jin
 
〈야생의 땅: 듀랑고〉 서버 아키텍처 Vol. 3
〈야생의 땅: 듀랑고〉 서버 아키텍처 Vol. 3〈야생의 땅: 듀랑고〉 서버 아키텍처 Vol. 3
〈야생의 땅: 듀랑고〉 서버 아키텍처 Vol. 3
Heungsub Lee
 
Ndc14 분산 서버 구축의 ABC
Ndc14 분산 서버 구축의 ABCNdc14 분산 서버 구축의 ABC
Ndc14 분산 서버 구축의 ABC
Ho Gyu Lee
 
게임서버프로그래밍 #0 - TCP 및 이벤트 통지모델
게임서버프로그래밍 #0 - TCP 및 이벤트 통지모델게임서버프로그래밍 #0 - TCP 및 이벤트 통지모델
게임서버프로그래밍 #0 - TCP 및 이벤트 통지모델
Seungmo Koo
 
Akka.NET 으로 만드는 온라인 게임 서버 (NDC2016)
Akka.NET 으로 만드는 온라인 게임 서버 (NDC2016)Akka.NET 으로 만드는 온라인 게임 서버 (NDC2016)
Akka.NET 으로 만드는 온라인 게임 서버 (NDC2016)
Esun Kim
 
임태현, MMO 서버 개발 포스트 모템, NDC2012
임태현, MMO 서버 개발 포스트 모템, NDC2012임태현, MMO 서버 개발 포스트 모템, NDC2012
임태현, MMO 서버 개발 포스트 모템, NDC2012devCAT Studio, NEXON
 
Multiplayer Game Sync Techniques through CAP theorem
Multiplayer Game Sync Techniques through CAP theoremMultiplayer Game Sync Techniques through CAP theorem
Multiplayer Game Sync Techniques through CAP theorem
Seungmo Koo
 
[IGC 2017] 아마존 구승모 - 게임 엔진으로 서버 제작 및 운영까지
[IGC 2017] 아마존 구승모 - 게임 엔진으로 서버 제작 및 운영까지[IGC 2017] 아마존 구승모 - 게임 엔진으로 서버 제작 및 운영까지
[IGC 2017] 아마존 구승모 - 게임 엔진으로 서버 제작 및 운영까지
강 민우
 
심예람, <프로젝트DH> AI 내비게이션 시스템, NDC2018
심예람, <프로젝트DH> AI 내비게이션 시스템, NDC2018심예람, <프로젝트DH> AI 내비게이션 시스템, NDC2018
심예람, <프로젝트DH> AI 내비게이션 시스템, NDC2018
devCAT Studio, NEXON
 
그럴듯한 랜덤 생성 컨텐츠 만들기
그럴듯한 랜덤 생성 컨텐츠 만들기그럴듯한 랜덤 생성 컨텐츠 만들기
그럴듯한 랜덤 생성 컨텐츠 만들기
Yongha Kim
 
유니티 + Nodejs를 활용한 멀티플레이어 게임 개발하기
유니티 + Nodejs를 활용한 멀티플레이어 게임 개발하기유니티 + Nodejs를 활용한 멀티플레이어 게임 개발하기
유니티 + Nodejs를 활용한 멀티플레이어 게임 개발하기
Kiyoung Moon
 

What's hot (20)

MMOG Server-Side 충돌 및 이동처리 설계와 구현
MMOG Server-Side 충돌 및 이동처리 설계와 구현MMOG Server-Side 충돌 및 이동처리 설계와 구현
MMOG Server-Side 충돌 및 이동처리 설계와 구현
 
실시간 게임 서버 최적화 전략
실시간 게임 서버 최적화 전략실시간 게임 서버 최적화 전략
실시간 게임 서버 최적화 전략
 
쿠키런 1년, 서버개발 분투기
쿠키런 1년, 서버개발 분투기쿠키런 1년, 서버개발 분투기
쿠키런 1년, 서버개발 분투기
 
게임서버프로그래밍 #1 - IOCP
게임서버프로그래밍 #1 - IOCP게임서버프로그래밍 #1 - IOCP
게임서버프로그래밍 #1 - IOCP
 
Quic을 이용한 네트워크 성능 개선
 Quic을 이용한 네트워크 성능 개선 Quic을 이용한 네트워크 성능 개선
Quic을 이용한 네트워크 성능 개선
 
라이브 서비스를 위한 게임 서버 구성
라이브 서비스를 위한 게임 서버 구성라이브 서비스를 위한 게임 서버 구성
라이브 서비스를 위한 게임 서버 구성
 
나만의 엔진 개발하기
나만의 엔진 개발하기나만의 엔진 개발하기
나만의 엔진 개발하기
 
[야생의 땅: 듀랑고] 서버 아키텍처 - SPOF 없는 분산 MMORPG 서버
[야생의 땅: 듀랑고] 서버 아키텍처 - SPOF 없는 분산 MMORPG 서버[야생의 땅: 듀랑고] 서버 아키텍처 - SPOF 없는 분산 MMORPG 서버
[야생의 땅: 듀랑고] 서버 아키텍처 - SPOF 없는 분산 MMORPG 서버
 
게임에서 흔히 쓰이는 최적화 전략 by 엄윤섭 @ 지스타 컨퍼런스 2013
게임에서 흔히 쓰이는 최적화 전략 by 엄윤섭 @ 지스타 컨퍼런스 2013게임에서 흔히 쓰이는 최적화 전략 by 엄윤섭 @ 지스타 컨퍼런스 2013
게임에서 흔히 쓰이는 최적화 전략 by 엄윤섭 @ 지스타 컨퍼런스 2013
 
KGC 2016: HTTPS 로 모바일 게임 서버 구축한다는 것 - Korea Games Conference
KGC 2016: HTTPS 로 모바일 게임 서버 구축한다는 것 - Korea Games ConferenceKGC 2016: HTTPS 로 모바일 게임 서버 구축한다는 것 - Korea Games Conference
KGC 2016: HTTPS 로 모바일 게임 서버 구축한다는 것 - Korea Games Conference
 
〈야생의 땅: 듀랑고〉 서버 아키텍처 Vol. 3
〈야생의 땅: 듀랑고〉 서버 아키텍처 Vol. 3〈야생의 땅: 듀랑고〉 서버 아키텍처 Vol. 3
〈야생의 땅: 듀랑고〉 서버 아키텍처 Vol. 3
 
Ndc14 분산 서버 구축의 ABC
Ndc14 분산 서버 구축의 ABCNdc14 분산 서버 구축의 ABC
Ndc14 분산 서버 구축의 ABC
 
게임서버프로그래밍 #0 - TCP 및 이벤트 통지모델
게임서버프로그래밍 #0 - TCP 및 이벤트 통지모델게임서버프로그래밍 #0 - TCP 및 이벤트 통지모델
게임서버프로그래밍 #0 - TCP 및 이벤트 통지모델
 
Akka.NET 으로 만드는 온라인 게임 서버 (NDC2016)
Akka.NET 으로 만드는 온라인 게임 서버 (NDC2016)Akka.NET 으로 만드는 온라인 게임 서버 (NDC2016)
Akka.NET 으로 만드는 온라인 게임 서버 (NDC2016)
 
임태현, MMO 서버 개발 포스트 모템, NDC2012
임태현, MMO 서버 개발 포스트 모템, NDC2012임태현, MMO 서버 개발 포스트 모템, NDC2012
임태현, MMO 서버 개발 포스트 모템, NDC2012
 
Multiplayer Game Sync Techniques through CAP theorem
Multiplayer Game Sync Techniques through CAP theoremMultiplayer Game Sync Techniques through CAP theorem
Multiplayer Game Sync Techniques through CAP theorem
 
[IGC 2017] 아마존 구승모 - 게임 엔진으로 서버 제작 및 운영까지
[IGC 2017] 아마존 구승모 - 게임 엔진으로 서버 제작 및 운영까지[IGC 2017] 아마존 구승모 - 게임 엔진으로 서버 제작 및 운영까지
[IGC 2017] 아마존 구승모 - 게임 엔진으로 서버 제작 및 운영까지
 
심예람, <프로젝트DH> AI 내비게이션 시스템, NDC2018
심예람, <프로젝트DH> AI 내비게이션 시스템, NDC2018심예람, <프로젝트DH> AI 내비게이션 시스템, NDC2018
심예람, <프로젝트DH> AI 내비게이션 시스템, NDC2018
 
그럴듯한 랜덤 생성 컨텐츠 만들기
그럴듯한 랜덤 생성 컨텐츠 만들기그럴듯한 랜덤 생성 컨텐츠 만들기
그럴듯한 랜덤 생성 컨텐츠 만들기
 
유니티 + Nodejs를 활용한 멀티플레이어 게임 개발하기
유니티 + Nodejs를 활용한 멀티플레이어 게임 개발하기유니티 + Nodejs를 활용한 멀티플레이어 게임 개발하기
유니티 + Nodejs를 활용한 멀티플레이어 게임 개발하기
 

Similar to 소셜게임 서버 개발 관점에서 본 Node.js의 장단점과 대안

Javascript everywhere - Node.js | Devon 2012
Javascript everywhere - Node.js | Devon 2012Javascript everywhere - Node.js | Devon 2012
Javascript everywhere - Node.js | Devon 2012Daum DNA
 
Nodejs발표자료 - 팀 세미나용
Nodejs발표자료 - 팀 세미나용 Nodejs발표자료 - 팀 세미나용
Nodejs발표자료 - 팀 세미나용
SuHyun Jeon
 
세션3 node.js의 의미와 자바의 대안
세션3 node.js의 의미와 자바의 대안세션3 node.js의 의미와 자바의 대안
세션3 node.js의 의미와 자바의 대안
Lee Ji Eun
 
Node.js 기본
Node.js 기본Node.js 기본
Node.js 기본
Han Jung Hyun
 
[NDC17] Unreal.js - 자바스크립트로 쉽고 빠른 UE4 개발하기
[NDC17] Unreal.js - 자바스크립트로 쉽고 빠른 UE4 개발하기[NDC17] Unreal.js - 자바스크립트로 쉽고 빠른 UE4 개발하기
[NDC17] Unreal.js - 자바스크립트로 쉽고 빠른 UE4 개발하기
현철 조
 
Node.js의 도입과 활용
Node.js의 도입과 활용Node.js의 도입과 활용
Node.js의 도입과 활용
Jin wook
 
Node.js in Flitto
Node.js in FlittoNode.js in Flitto
Node.js in Flitto
SeungWoo Lee
 
머신러닝 및 데이터 과학 연구자를 위한 python 기반 컨테이너 분산처리 플랫폼 설계 및 개발
머신러닝 및 데이터 과학 연구자를 위한 python 기반 컨테이너 분산처리 플랫폼 설계 및 개발머신러닝 및 데이터 과학 연구자를 위한 python 기반 컨테이너 분산처리 플랫폼 설계 및 개발
머신러닝 및 데이터 과학 연구자를 위한 python 기반 컨테이너 분산처리 플랫폼 설계 및 개발
Jeongkyu Shin
 
Node.js 팀 스터디 발표자료.
Node.js 팀 스터디 발표자료.Node.js 팀 스터디 발표자료.
Node.js 팀 스터디 발표자료.
SeungWoo Lee
 
Node.js intro
Node.js introNode.js intro
Node.js intro
Chul Ju Hong
 
[IoT] MAKE with Open H/W + Node.JS - 3rd
[IoT] MAKE with Open H/W + Node.JS - 3rd[IoT] MAKE with Open H/W + Node.JS - 3rd
[IoT] MAKE with Open H/W + Node.JS - 3rd
Park Jonggun
 
[오픈소스컨설팅]쿠버네티스를 활용한 개발환경 구축
[오픈소스컨설팅]쿠버네티스를 활용한 개발환경 구축[오픈소스컨설팅]쿠버네티스를 활용한 개발환경 구축
[오픈소스컨설팅]쿠버네티스를 활용한 개발환경 구축
Ji-Woong Choi
 
이승재, 실버바인 서버엔진 2 설계 리뷰, NDC2018
이승재, 실버바인 서버엔진 2 설계 리뷰, NDC2018이승재, 실버바인 서버엔진 2 설계 리뷰, NDC2018
이승재, 실버바인 서버엔진 2 설계 리뷰, NDC2018
devCAT Studio, NEXON
 
Node.js
Node.jsNode.js
Node.js
ymtech
 
Node.js 시작하기
Node.js 시작하기Node.js 시작하기
Node.js 시작하기
Huey Park
 
Ndc2013 정리(upload버전)
Ndc2013 정리(upload버전)Ndc2013 정리(upload버전)
Ndc2013 정리(upload버전)
Minsu Park
 
Node.js + Websocket 삽질기
Node.js + Websocket 삽질기Node.js + Websocket 삽질기
Node.js + Websocket 삽질기
Paprikhan
 
빠르게훓어보는 Node.js와 Vert.x
빠르게훓어보는 Node.js와 Vert.x빠르게훓어보는 Node.js와 Vert.x
빠르게훓어보는 Node.js와 Vert.x
Terry Cho
 
CUDA 프로그래밍 기초 MODUCON2018
CUDA 프로그래밍 기초 MODUCON2018CUDA 프로그래밍 기초 MODUCON2018
CUDA 프로그래밍 기초 MODUCON2018
Shengzhe Li
 
스마트폰 앱 백-엔드 솔루션 개발을 위한 Node.js 실전 가이드
스마트폰 앱 백-엔드 솔루션 개발을 위한 Node.js 실전 가이드스마트폰 앱 백-엔드 솔루션 개발을 위한 Node.js 실전 가이드
스마트폰 앱 백-엔드 솔루션 개발을 위한 Node.js 실전 가이드Jeongsang Baek
 

Similar to 소셜게임 서버 개발 관점에서 본 Node.js의 장단점과 대안 (20)

Javascript everywhere - Node.js | Devon 2012
Javascript everywhere - Node.js | Devon 2012Javascript everywhere - Node.js | Devon 2012
Javascript everywhere - Node.js | Devon 2012
 
Nodejs발표자료 - 팀 세미나용
Nodejs발표자료 - 팀 세미나용 Nodejs발표자료 - 팀 세미나용
Nodejs발표자료 - 팀 세미나용
 
세션3 node.js의 의미와 자바의 대안
세션3 node.js의 의미와 자바의 대안세션3 node.js의 의미와 자바의 대안
세션3 node.js의 의미와 자바의 대안
 
Node.js 기본
Node.js 기본Node.js 기본
Node.js 기본
 
[NDC17] Unreal.js - 자바스크립트로 쉽고 빠른 UE4 개발하기
[NDC17] Unreal.js - 자바스크립트로 쉽고 빠른 UE4 개발하기[NDC17] Unreal.js - 자바스크립트로 쉽고 빠른 UE4 개발하기
[NDC17] Unreal.js - 자바스크립트로 쉽고 빠른 UE4 개발하기
 
Node.js의 도입과 활용
Node.js의 도입과 활용Node.js의 도입과 활용
Node.js의 도입과 활용
 
Node.js in Flitto
Node.js in FlittoNode.js in Flitto
Node.js in Flitto
 
머신러닝 및 데이터 과학 연구자를 위한 python 기반 컨테이너 분산처리 플랫폼 설계 및 개발
머신러닝 및 데이터 과학 연구자를 위한 python 기반 컨테이너 분산처리 플랫폼 설계 및 개발머신러닝 및 데이터 과학 연구자를 위한 python 기반 컨테이너 분산처리 플랫폼 설계 및 개발
머신러닝 및 데이터 과학 연구자를 위한 python 기반 컨테이너 분산처리 플랫폼 설계 및 개발
 
Node.js 팀 스터디 발표자료.
Node.js 팀 스터디 발표자료.Node.js 팀 스터디 발표자료.
Node.js 팀 스터디 발표자료.
 
Node.js intro
Node.js introNode.js intro
Node.js intro
 
[IoT] MAKE with Open H/W + Node.JS - 3rd
[IoT] MAKE with Open H/W + Node.JS - 3rd[IoT] MAKE with Open H/W + Node.JS - 3rd
[IoT] MAKE with Open H/W + Node.JS - 3rd
 
[오픈소스컨설팅]쿠버네티스를 활용한 개발환경 구축
[오픈소스컨설팅]쿠버네티스를 활용한 개발환경 구축[오픈소스컨설팅]쿠버네티스를 활용한 개발환경 구축
[오픈소스컨설팅]쿠버네티스를 활용한 개발환경 구축
 
이승재, 실버바인 서버엔진 2 설계 리뷰, NDC2018
이승재, 실버바인 서버엔진 2 설계 리뷰, NDC2018이승재, 실버바인 서버엔진 2 설계 리뷰, NDC2018
이승재, 실버바인 서버엔진 2 설계 리뷰, NDC2018
 
Node.js
Node.jsNode.js
Node.js
 
Node.js 시작하기
Node.js 시작하기Node.js 시작하기
Node.js 시작하기
 
Ndc2013 정리(upload버전)
Ndc2013 정리(upload버전)Ndc2013 정리(upload버전)
Ndc2013 정리(upload버전)
 
Node.js + Websocket 삽질기
Node.js + Websocket 삽질기Node.js + Websocket 삽질기
Node.js + Websocket 삽질기
 
빠르게훓어보는 Node.js와 Vert.x
빠르게훓어보는 Node.js와 Vert.x빠르게훓어보는 Node.js와 Vert.x
빠르게훓어보는 Node.js와 Vert.x
 
CUDA 프로그래밍 기초 MODUCON2018
CUDA 프로그래밍 기초 MODUCON2018CUDA 프로그래밍 기초 MODUCON2018
CUDA 프로그래밍 기초 MODUCON2018
 
스마트폰 앱 백-엔드 솔루션 개발을 위한 Node.js 실전 가이드
스마트폰 앱 백-엔드 솔루션 개발을 위한 Node.js 실전 가이드스마트폰 앱 백-엔드 솔루션 개발을 위한 Node.js 실전 가이드
스마트폰 앱 백-엔드 솔루션 개발을 위한 Node.js 실전 가이드
 

More from Jeongsang Baek

로그 기깔나게 잘 디자인하는 법
로그 기깔나게 잘 디자인하는 법로그 기깔나게 잘 디자인하는 법
로그 기깔나게 잘 디자인하는 법
Jeongsang Baek
 
[NDC16] (애드브릭스) 라이브마이그레이션 분투기 - 달리는 분석 툴의 바퀴를 갈아 끼워보자!
[NDC16] (애드브릭스) 라이브마이그레이션 분투기 - 달리는 분석 툴의 바퀴를 갈아 끼워보자![NDC16] (애드브릭스) 라이브마이그레이션 분투기 - 달리는 분석 툴의 바퀴를 갈아 끼워보자!
[NDC16] (애드브릭스) 라이브마이그레이션 분투기 - 달리는 분석 툴의 바퀴를 갈아 끼워보자!
Jeongsang Baek
 
NDC15_백정상_최종_모바일_앱의_실시간_운영을_위한_유저분석과_타게팅_기법
NDC15_백정상_최종_모바일_앱의_실시간_운영을_위한_유저분석과_타게팅_기법NDC15_백정상_최종_모바일_앱의_실시간_운영을_위한_유저분석과_타게팅_기법
NDC15_백정상_최종_모바일_앱의_실시간_운영을_위한_유저분석과_타게팅_기법
Jeongsang Baek
 
(GameTech2015) Live Operation by Adbrix의 Node.js와 MongoDB를 이용한 멀티테넌트 인프라 구축사례
(GameTech2015) Live Operation by Adbrix의 Node.js와 MongoDB를 이용한 멀티테넌트 인프라 구축사례(GameTech2015) Live Operation by Adbrix의 Node.js와 MongoDB를 이용한 멀티테넌트 인프라 구축사례
(GameTech2015) Live Operation by Adbrix의 Node.js와 MongoDB를 이용한 멀티테넌트 인프라 구축사례
Jeongsang Baek
 
Inside node.js
Inside node.jsInside node.js
Inside node.js
Jeongsang Baek
 

More from Jeongsang Baek (6)

로그 기깔나게 잘 디자인하는 법
로그 기깔나게 잘 디자인하는 법로그 기깔나게 잘 디자인하는 법
로그 기깔나게 잘 디자인하는 법
 
[NDC16] (애드브릭스) 라이브마이그레이션 분투기 - 달리는 분석 툴의 바퀴를 갈아 끼워보자!
[NDC16] (애드브릭스) 라이브마이그레이션 분투기 - 달리는 분석 툴의 바퀴를 갈아 끼워보자![NDC16] (애드브릭스) 라이브마이그레이션 분투기 - 달리는 분석 툴의 바퀴를 갈아 끼워보자!
[NDC16] (애드브릭스) 라이브마이그레이션 분투기 - 달리는 분석 툴의 바퀴를 갈아 끼워보자!
 
NDC15_백정상_최종_모바일_앱의_실시간_운영을_위한_유저분석과_타게팅_기법
NDC15_백정상_최종_모바일_앱의_실시간_운영을_위한_유저분석과_타게팅_기법NDC15_백정상_최종_모바일_앱의_실시간_운영을_위한_유저분석과_타게팅_기법
NDC15_백정상_최종_모바일_앱의_실시간_운영을_위한_유저분석과_타게팅_기법
 
(GameTech2015) Live Operation by Adbrix의 Node.js와 MongoDB를 이용한 멀티테넌트 인프라 구축사례
(GameTech2015) Live Operation by Adbrix의 Node.js와 MongoDB를 이용한 멀티테넌트 인프라 구축사례(GameTech2015) Live Operation by Adbrix의 Node.js와 MongoDB를 이용한 멀티테넌트 인프라 구축사례
(GameTech2015) Live Operation by Adbrix의 Node.js와 MongoDB를 이용한 멀티테넌트 인프라 구축사례
 
Inside node.js
Inside node.jsInside node.js
Inside node.js
 
What’s new in c++11
What’s new in c++11What’s new in c++11
What’s new in c++11
 

소셜게임 서버 개발 관점에서 본 Node.js의 장단점과 대안

  • 1. 1st node.js Korea conference 소셜게임 서버 개발 관점에서 본 node.js의 장단점과 대안 블루윈드 백정상 2012.11.20
  • 2. 발표자 소개 예젂엔 PC 온라읶 게임 서버 개발자 Page 2
  • 3. 발표자 소개 지금은 모바읷 게임 서버 개발자 Page 3
  • 5. 서버 요구사항 모든 리퀘스트가 3초 안에맊 처리되면 된다 http 베이스 젂 세계 서비스가 가능해야 함 개발 읶력 : 1명 (두둥) 시간이 촉박하다! – 3개웏 안에 출시한다! Page 5
  • 6. 기존에 많이 쓰던 소셜 플랫폼 Apache / php – 젂통의 강자 – Zynga 및 맋은 게임에서 사용 – 익숙하고 편한 언어환경 http://www.raphkoster.com/2010/03/12/gdc10-scaling-social-games-robert-zubek/ Page 6
  • 7. 왜 node.js를 선택했는가 퍼포먼스 자바 스크립트 알찬 기본 라이브러리 유용한 써드 파티 모듈들 Page 7
  • 8. 왜 node.js를 선택했는가 퍼포먼스 – node.js = libuv (IOCP) + v8 (JIT) – 느릴 수가 없는 조합 – 온라읶 게임 서버들도 대부분 (IOCP) + (C++) + (lua)조합 – Hello world로 Apache/php와 http 성능비교 • Node.js가 약 10배정도 빨랐음 – 이 정도면 성능은 믿고 가자 • 적젃히 타협 Page 8
  • 9. 왜 node.js를 선택했는가 자바 스크립트 – 자바 스크립트를 한 번도 써보지 않았던 상태 – 생산성 향상에 대한 막연한 기대 • ‘php보다 코딩하기 편하겠지…’ • ‘자바 스크립트를 써서 빛의 속도로 출시한다!’ • 나중에 엄청난 후회… Page 9
  • 10. 왜 node.js를 선택했는가 알찬 기본 라이브러리 – 소셜 게임 개발에 필요한 것은 다 있음 – API 문서도 인기 쉽게 잘 작성됨 사용한 기본 라이브러리들 – http, https – url, querystring – util – buffer, stream – fs – crypto – etc… Page 10
  • 11. 왜 node.js를 선택했는가 생산성 향상에 기여한 써드파티 모듈들 – node-tds (MSSQL) – node-vows (BDD) – node-xml2js (XML -> json) – ya-csv (CSV) – node-memcache (memcached) – node-twitter (server crash reporter) – node-mysql (MySQL) – node-apns (Apple Push Notification Service) Page 11
  • 12. 결론 이렇게 된 이상 모든 걸 node.js로 짠다! Page 12
  • 13. 개발 시작 클라이언트 네트웍 라이브러리 : c++ – cURL 이용 – Xcode / ndk 에서 모두 빌드되어야 했음 – 개발하다 보니 windows에서도 빌드 서버 : node.js – 개발은 windows 7 에서 짂행 – Windows 2008 Server R2 에서 실행 – 왜? 게임이 잘 되면 개발자 뽑기 쉬우라고… • 근데 Windows 에선 안 되는 것이 맋다! • 나중에 맋이 후회… Page 13
  • 15. 에디터 Vim – 늘상 써왔던 그것 findStr – windows에서 찾은 grep eclipse – 잠시 썼으나 workspace관리가 불편해 버림 불편하다! Page 15
  • 16. node.js 디버깅 방법 Google Chrome Developer Tools – 서버를 디버그 모드로 띄우고 – eclipse로 붙어서 확읶하는 방법 – 안되쟎아 Logging – 늘상 해오던 그것 결론적으로 불편하다! Page 16
  • 17. 대안 WebStorm – http://www.jetbrains.com/webstorm/ – node.js를 지웎 – IDE에서 구현 후 바로 실행 및 디버깅 가능 – 자동 완성 기능 – 적젃한 가격 ($29 ~ $99) Page 17
  • 18. npm 윈도에서는 대부분의 모듈 사용 불가 – unix계열 모듈 의존성 문제가 있음 – 대부분의 써드 파티 모듈을 git-hub에서 직접 다운로드 후 node_modules 폴더에 추가 – 어차피 모듈 버젂을 프리즈 해야 했으므로 큰 문제는 안 됨 Page 18
  • 19. javascript 자바 스크립트로 비즈니스 로직을 잘 짜기 너 무 어렵다 해당 구문이 실행되기 젂 까짂 문제가 발생하 지 않음 – 서버가 죽고 나서야 문제를 알게 됨 – QA가 없는 1읶 개발의 슬픈 현실에선 큰 불안요소 Page 19
  • 20. 너무 암묵적인 게 문제 function Obj() { } Obj.prototype.value = function() { return 11; } function calc(obj) { return obj.value - 1; //should throw an exception! } function if (require.main == module) { var obj = new Obj(); var added = calc(obj) + 1; // NaN + 1 = NaN console.log('result: ', added); } Page 20
  • 21. 타이포 var levelTable = { 1:10, 2:20, 3:30 }; levelTable[1] // 10 levelTable[4] // undefined leveltable[4] // ReferenceError 구문이 실행되는 시점에 죽는 게 함정 Page 21
  • 22. this가 그 this가 아니군 User.prototype.updateRating = function() { //플레이어 Rating 업데이트 … }; User.prototype.removeRoom = function(roomId, cb) { this.tower.removeRoom(roomId, function() { this.updateRating() //exception cb(); }); }; Page 22
  • 23. this가 그 this가 아니군 User.prototype.updateRating = function() { //플레이어 Rating 업데이트 … }; User.prototype.removeRoom = function(roomId, cb) { var self = this; this.tower.getRoom(roomId, function() { self.updateRating() cb(); }); }; Page 23
  • 24. 대안 테스트 주도 개발 (강력 추천) – 클라이언트 사이드 : google test – 서버 사이드 : vows, 자체 개발 tdd 툴 – 3대 크래시 주범이 대부분 테스트 레벨에서 걸러짐 – regression도 방지 – 라이브 때 서버가 거의 안 죽어줘서 고마웠음 Page 24
  • 25. 대안 UncaughtException을 핸들링 – 최소한 서버 크래시는 방지 – Error 오브젝트가 타입이 애매모호한 게 함정 – node-twitter를 사용하여 uncaught exception 핸들 시 트 위터에 알림 (강력 추천) Page 25
  • 26. Single instance == single thread Node.js는 싱글 스레드 기반 – I/O가 수반되는 작업이나 이벤트는 event loop에서 작업 – 하지맊 비즈니스 로직은 하나의 스레드에서 실행 – 클로져를 젂달한다고 비동기로 처리되는 게 아님 – 멀티코어 환경에서 젂체 CPU를 사용하지 못한다는 문제 가 있었음 Page 26
  • 27. 대안 cluster – 하나의 읶스턴스에서 하나의 포트로 여러 프로세스를 클 러스터링 • child_process.fork() – master -> worker로의 로드 밸런싱 지웎 Page 27
  • 28. cluster 예제 var cluster = require('cluster'); var http = require('http'); var numCPUs = require('os').cpus().length; if (cluster.isMaster) { // Fork workers. for (var i = 0; i < numCPUs; i++) { cluster.fork(); } cluster.on('exit', function(worker, code, signal) { console.log('worker ' + worker.process.pid + ' died'); }); } else { // Workers can share any TCP connection // In this case its a HTTP server http.createServer(function(req, res) { res.writeHead(200); res.end("hello worldn"); }).listen(8000); } Page 28
  • 29. CPS Continuation-Passing Style – Closure • 함수 안의 함수 • 윗 함수의 레퍼런스를 참조 가능 – Coroutine • 수행 지점을 설정 가능한 서브루틴 • yield()등으로 수행을 양보하고, resume()등으로 양보한 시점부터 실행이 가능 • yield, resume 시점에 context를 주고받을 수 있음 Page 29
  • 30. Closure 예제 function say11() { var num = 10; var sayAlert = function() { console.log(num); } num++; return sayAlert; } Page 30
  • 31. Coroutine 예제 var coroutine = process.binding(‘coroutine’).coroutine; var co = coroutine.create(function(name) { var questId = 11; console.log(‘My name is‘, name); console.log(‘Do you want to play this quest?’); var selected = coroutine.yield(questId); if (selected == true) { console.log(‘Let’s play!’); } else { console.log(‘See you next time’); } }); var qId = coroutine.resume(co, ‘hackest’); console.log(‘qId: ‘, qId); coroutine.resume(co, true); Page 31
  • 32. Closure, Coroutine 한 때 뜨거웠던 토론 주제 node.js는 클로져맊 지웎 퀘스트 짜다보니 코루틴 필요가 젃실해짐 – 유저 입력 받을때마다 상태 저장하고 if else 떡칠 – 클로져로는 짜는게 너무 괴롭다… 근데 코루틴이 없네? Page 32
  • 33. 찾아본 라이브러리 node-fiber – node.js 내에 자체 구현한 코루틴과 파이버를 제공 – 근데 Windows에서 실행이 안 된다! 한참을 찾다가 결국 자체 노드 바읶딩을 맊들 어보기로 결심 – js-coroutine에서 모티브를 얻음 – 마침 잉여력도 좀 있었음 http://code.google.com/p/js-coroutine/ Page 33
  • 34. 붙여볼 코루틴 라이브러리 Portable Coroutine Library – 오픈소스 – 기본적읶 execution control environment를 제공 – C API 제공 http://xmailserver.org/libpcl.html Page 34
  • 35. node.js 프로그램 구조 application code (user implementation) node standard library (socket, os, zlib, etc…) node bindings (node_socket, node_os, node_zlib, etc…) native core (V8, libuv, openssl, zlib, etc…) Page 35
  • 36. coroutine 추가 application code (user implementation) node standard library (socket, os, zlib, coroutine, etc…) node bindings (node_socket, node_os, node_zlib, node_ coroutine, etc…) native core (V8, libuv, openssl, zlib, libpcl etc…) Page 36
  • 37. 데모 시연 Page 37
  • 38. 요약 퍼포먼스 때문에 node.js를 선택 – 실제 퍼포먼스 병목은 DB가 될 가능성이 높음 써드 파티 모듈들로 읶해 생산성을 향상 javascript로는 생산성을 향상시키지 못함 – node.lua도 괜찮을 듯 javascript로 안정적 서비스 하려면 무조건 TDD를 도입 – 언어 특성상 프로젝트가 커지면 핸들 하기 어려워집니다 코루틴이 필요하면 붙이면 됩니다 – 애드온 형태로 붙이셔도 됩니다 Page 38