ݺߣ

ݺߣShare a Scribd company logo
스마트폰 앱 백-엔드 솔루션 개발을
위한 Node.js 실전 가이드
BLUE WIND
백정상
연사 소개


10년차 서버 프로그래머



주로 PC 온라인 게임을 개발


(2003) 크로니클스



(2005) 팀 레볼루션



(2006) 마비노기



(2009) 넥슨 클래식 RPG



(2011) 스틸독



(2011) 마법천자문 온라인
연사 소개


현재는 BLUE WIND 기술이사


가로세로 온라인



가로세로 2013



B-TOWER



LINE QUIZ
연사 소개


작년 발표 내용
BLUE WIND


유서 깊은 모바일 게임 개발사



포트폴리오


Christmas Santa



도둑 루팡



가로세로 낱말맟추기



퀴즈 킹 for kakao



라인 퀴즈
이런 분들에게 도움이 되길


1인 서버 개발자



앱 개발에 붙일 서버를 만들어야 하는 분



그 서버를 단기간에 만들어야 하는 분



라이브 서비스를 준비중인 Node.js 개발자
Node.js는 무엇인가
Node.js


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.

http://nodejs.org/
왜 Node.js를 선택했나


Node.js


오픈 소스



libuv(IOCP) + V8(JIT)의 믿고 쓰는 조합



지속적인 업데이트



잘 작성된 레퍼런스



많은 미국 대기업에서 도입

http://nodejs.org/industry/
첫 로젝트 적용 사례
첫 적용 로젝트


B-TOWER
로젝트 요구사항


징가 스타일 소셜게임



http 프로토콜 베이스 서버



개발 인원 : 클라 1, 서버 1, 기획 1, 디자이너 1



초기 예상 개발 기간 : 3개월



전 세계 출시



안드로이드 아이폰 동시 출시
첫 서버 구현


HTTP 프로토콜에 대해 잘 모르던 시절


HTTP 프로토콜 1.1 표준 보면서 공부



Node.js 의 http 모듈과 기본 라이브러리 사용하여 전부 구현



Server Push 가 안되쟎아!


Long polling 기법 사용
server.js


기본 라이브러리로

웹 서비스 전부 다 구현
필요한 부가 기능들은


기본 라이브러리 만으로도 원하는 기능 거의 다 구현



기능이 없는 경우 서드파티 모듈을 충분히 사용



유용한 서드파티 모듈은 NPM(https://npmjs.org/)을 이용해 탐색



NPM client을 이용해서 다운로드 및 업데이트


이젠 Windows에서도 잘 동작
유용하게 사용한 기본 라이브러리


http, https



url, querystring



util



buffer, stream



fs



crypto
유용하게 사용한 서드파티 라이브러리


node-tds (MSSQL)



node-vows (BDD)



node-xml2js (XML->json)



ya-csv (CSV), node-xlsx (XLSX)



node-memcache



node-twitter



node-mysql



node-apns (Apple Push Notification Service)
라이브 이슈
라이브 이슈


서버 벤치마크



초기 서비스 환경 설정



로드 밸런서



cluster.js 퍼포먼스



서버 에이전트
서버 벤치마크


실제 구현한 서버의 성능이 어느 수준일지 미지수였음



컨텐츠가 다 구현 된 후에 사내 테스트 서버에서 측정



단순한 웹 서비스 퍼포먼스 말고, 다른 모듈과 연관된 퍼포먼스가 매
우 중요한 이슈였음
측정 방법


http 서버의 ‘request’이벤트 시점에서 이벤트 완료되어 리스펀스 주
는 시점까지의 시간을 측정



밀리세컨드 단위
테스트 환경


Windows 2008 R2



i5 2500



8GB



SATA HDD 1TB



Node.js + MSSQL + memcached



1 instance
B-TOWER 벤치마크
평균 응답속도(ms)
/matchFriends

166.26

/loadFriends

82.73

/construct

30.33

28.39

/findFriend
/login

22.26

/exportGameData

7.35

/useCash

7.07

/visitFriendTower

6.79

/importGameData

6.79

/changebg

6.35

/moveRoomToInven

6.18

0.00

20.00

40.00

60.00

80.00

평균 응답속도(ms)

100.00

120.00

140.00

160.00

180.00
B-TOWER 벤치마크
평균 응답속도(ms)
/loadPropertyTable

1.92

/playStaffRoom

1.82

/loadInventory

1.81

1.78

/playRouletteStaffRoom

/loadHelpers

1.73

/getPhoto

1.73

/givePresent

1.65

/helpFriend

1.64

/moveRoom

1.57

/getDailyBonus
0.00

1.51
0.50

1.00
평균 응답속도(ms)

1.50

2.00

2.50
분석


상위 랭크는 대부분 DB 연동 리퀘스트



DB와 관련 없는 리퀘스트는 대부분 2ms 미만에 처리



백-엔드보다 DB 튜닝이 퍼포먼스 향상에 더 많은 도움
초기 라이브 서비스 환경


Amazon Web Services EC2



US East(Northern Virginia)



Small instance * 1 (control server)



Small instance * 1~3 (game server)



Medium instance * 2 (DB server, replication server)



EC2 Load Balancer * 2
서비스 환경

memcached

게임 서버
DB 서버
관리자 컴퓨터

스마트폰 앱

컨트롤 서버

로드 밸런서
DB 리플리케이션
로드 밸런서


AWS 로드 밸런서는 Session Stickiness를 80포트만 지원



다른 포트를 사용하는데 Session Stickiness 는 지원해야 됨





서버 로컬 캐시데이터 참조
결제

간단하게 프록시를 Node.js로 제작


라운드 로빈 베이스



Session Stickiness 지원



100줄 미만의 코드로 동작
프록시


각 서버에 아이디 부여



세션 아이디에 서버 아이디를

포함해 통신중인 서버 확인
프록시


메시지 포워드는 http 모듈로
cluster.js 퍼포먼스


Cluster모듈은 node.js의 병렬 처리를 강화하기 위해 만들어짐



근데 실제 멀티코어를 100프로 활용하진 못함



WCF로 구현한 서버와 쿼드코어 머신에서 3~4배 정도 성능 차이가
발생
내부를 보니


process fork 하는 구조



멀티스레드 형태의 구현보단 퍼포먼스가…



ec2 small 인스턴스를 다수 사용하는

방식으로 우회

cluster.js
서버 에이전트


서버들의 상태를 지속적으로 체크해주는 서버가 필요해짐



100줄 남짓으로 구현



서버들의 상태를 지속적으로 체크하여 서버가 죽을 경우 담당자에게
알림



서버 에이전트를 통해 서버 원격제어의 가능성이 열림
서버 에이전트 구성
서버 에이전트

게임 서버

3. 컨트롤 서버에서 각
서버를 원격 제어

관리자 컴퓨터

컨트롤 서버

2. 수집한 정보를
컨트롤 서버에 전달

1. 주기적으로 서버 상태를 체크
서버 에이전트


기본 설정
서버 에이전트


서버 시작, 종료, 재시작
서버 에이전트


업데이트 / 상태 확인
서버 에이전트


서버 실행은 스크립트로
Node.js를 써보니


필요한 백-엔드 기능을 간단하게 만들기 좋음


필요한 게 생기면 일단 빨리 만들어 붙이고



이슈 발생시 적합한 다른 오픈 소스 솔루션으로 교체



퍼포먼스 괜찮음



종합적인 느낌은 잘 훈련한 복서
추가자료 1. 다음 로젝트
다음 로젝트 요구사항


2D 스테이지 퍼즐게임



한국 출시



유저간 실시간 대전 지원



소셜 기능



방대한 컨텐츠
다음 로젝트도


Node.js 를 사용




그래도 아직까진 여러 선택지중에 제일 쓸만함

실시간 대전은 CPP로
새롭게 도입한 모듈


생산성을 높여준 코어 모듈





express
mongoose

Coffee-script는 사용하다 보류



자바 스크립트의 bad part는 그대로 물려받음





Webstorm에서도 디버깅이 완벽 지원되지 않음
버그 발생시 문제점을 찾기 어려움

Redis는 사용하다 보류




Mongodb만으로도 충분

Mocha는 좋은 테스트 프레임워크
추가자료 2. B-TOWER 벤치마크 순 데이터
스마트폰 앱 백-엔드 솔루션 개발을 위한 Node.js 실전 가이드
스마트폰 앱 백-엔드 솔루션 개발을 위한 Node.js 실전 가이드
감사합니다
jsbaek@abluewind.com

More Related Content

스마트폰 앱 백-엔드 솔루션 개발을 위한 Node.js 실전 가이드