NHN NEXT 게임 서버 프로그래밍 강의 자료입니다. 최소한의 필요한 이론 내용은 질문 위주로 구성되어 있고 (답은 학생들 개별로 고민해와서 피드백 받는 방식) 해당 내용에 맞는 실습(구현) 과제가 포함되어 있습니다.
참고로, 서버 아키텍처에 관한 과목은 따로 있어서 본 강의에는 포함되어 있지 않습니다.
[야생의 땅: 듀랑고] 서버 아키텍처 - SPOF 없는 분산 MMORPG 서버Heungsub Lee
NDC14에서 발표한 "[야생의 땅: 듀랑고] 서버 아키텍처" 세션의 슬라이드입니다.
슬라이드에 설명이 많지 않은데, 디스이즈게임에서 발표 내용을 잘 정리해주었습니다. 기사도 함께 보시면 좋을 것 같습니다.
http://www.thisisgame.com/webzine/news/nboard/4/?n=54955
NHN NEXT 게임 서버 프로그래밍 강의 자료입니다. 최소한의 필요한 이론 내용은 질문 위주로 구성되어 있고 (답은 학생들 개별로 고민해와서 피드백 받는 방식) 해당 내용에 맞는 실습(구현) 과제가 포함되어 있습니다.
참고로, 서버 아키텍처에 관한 과목은 따로 있어서 본 강의에는 포함되어 있지 않습니다.
오픈 소스 Actor Framework 인 Akka.NET 을 통해 온라인 게임 서버를 어떻게 구현할 수 있는지를 설명합니다. Actor Model 에 대한 기본 이해부터 Scale-out 가능한 게임 서버 구축까지 전반적인 내용에 대해 알 수 있습니다. 설명을 위해 클라이언트는 Unity3D 를 사용할 예정입니다.
멀티플레이어 게임을 서비스하는 데 필요한 게임 장르별 백엔드 아키텍처에 대한 설명해 드립니다. 기본적인 게임의 상태 동기화 개념과 서버 구성에 관한 이야기, 게임 클라이언트 엔진(Unity, Lumberyard, Unreal Engine 등)에서 제공하는 복제 프레임워크를 통하여 손쉽게 게임 서버를 만드는 방법에 대한 내용을 다룹니다. 또한, 이렇게 만들어진 게임 서버를 Amazon GameLift라는 클라우드 서비스를 통해 DevOps형태의 비용 효율적으로 서비스하는 방법에 대해 소개합니다.
NHN NEXT 게임 서버 프로그래밍 강의 자료입니다. 최소한의 필요한 이론 내용은 질문 위주로 구성되어 있고 (답은 학생들 개별로 고민해와서 피드백 받는 방식) 해당 내용에 맞는 실습(구현) 과제가 포함되어 있습니다.
참고로, 서버 아키텍처에 관한 과목은 따로 있어서 본 강의에는 포함되어 있지 않습니다.
[야생의 땅: 듀랑고] 서버 아키텍처 - SPOF 없는 분산 MMORPG 서버Heungsub Lee
NDC14에서 발표한 "[야생의 땅: 듀랑고] 서버 아키텍처" 세션의 슬라이드입니다.
슬라이드에 설명이 많지 않은데, 디스이즈게임에서 발표 내용을 잘 정리해주었습니다. 기사도 함께 보시면 좋을 것 같습니다.
http://www.thisisgame.com/webzine/news/nboard/4/?n=54955
NHN NEXT 게임 서버 프로그래밍 강의 자료입니다. 최소한의 필요한 이론 내용은 질문 위주로 구성되어 있고 (답은 학생들 개별로 고민해와서 피드백 받는 방식) 해당 내용에 맞는 실습(구현) 과제가 포함되어 있습니다.
참고로, 서버 아키텍처에 관한 과목은 따로 있어서 본 강의에는 포함되어 있지 않습니다.
오픈 소스 Actor Framework 인 Akka.NET 을 통해 온라인 게임 서버를 어떻게 구현할 수 있는지를 설명합니다. Actor Model 에 대한 기본 이해부터 Scale-out 가능한 게임 서버 구축까지 전반적인 내용에 대해 알 수 있습니다. 설명을 위해 클라이언트는 Unity3D 를 사용할 예정입니다.
멀티플레이어 게임을 서비스하는 데 필요한 게임 장르별 백엔드 아키텍처에 대한 설명해 드립니다. 기본적인 게임의 상태 동기화 개념과 서버 구성에 관한 이야기, 게임 클라이언트 엔진(Unity, Lumberyard, Unreal Engine 등)에서 제공하는 복제 프레임워크를 통하여 손쉽게 게임 서버를 만드는 방법에 대한 내용을 다룹니다. 또한, 이렇게 만들어진 게임 서버를 Amazon GameLift라는 클라우드 서비스를 통해 DevOps형태의 비용 효율적으로 서비스하는 방법에 대해 소개합니다.
머신러닝 및 데이터 과학 연구자를 위한 python 기반 컨테이너 분산처리 플랫폼 설계 및 개발Jeongkyu Shin
머신러닝 및 데이터 과학 분야의 컴퓨팅 수요는 해가 갈수록 급증하고 있습니다. 이와 더불어 분산처리 기술, 데이터 파이프라이닝 및 개발 환경 스택 관리 등의 관련된 다양한 이슈들 또한 엄청나게 늘어나고 있습니다. 머신러닝 모델의 기하급수적인 모델 복잡도 증가 추세와 마찬가지로, 모델 학습을 위한 환경 관리 또한 갈수록 복잡도가 높아지는 추세입니다.
이 세션에서는 이러한 문제를 해결하기 위해 python 언어 기반의 분산처리 스케쥴링/오케스트레이션 미들웨어 플랫폼을 개발한 4년간의 과정에서 겪은 다양한 문제들에 대해 다룹니다. 2015년 컨테이너 기반의 고밀도 분산처리 플랫폼 설계 및 프로토타이핑 과정을 PyCon KR에서 발표한 이후, 실제 구현 및 오픈소스화, 안정화를 거치며 겪은 다양한 기술적/비기술적 문제들에 대한 경험을 공유합니다.
기술적으로는 최근 몇 년 간의 클러스터 플랫폼 관련 기술의 진보와 함께 탄생한 다양한 도구들과, 이러한 도구들을 python 기반으로 엮어내기 위해 사용하고 개발한 다양한 오픈소스들을 다룹니다. Python 기반의 컨테이너 스케쥴링 및 오케스트레이션 과정의 구현과, 다양한 프로그래밍 언어로 만든 SDK를 graphQL을 이용하여 연동하는 과정에서의 몇몇 유의점을 설명합니다. 아울러 python 기반의 SDK를 다양한 언어로 포팅했던 경험을 간단하게 안내합니다.
플랫폼을 개발하는 중 등장한 TensorFlow, PyTorch 등의 다양한 머신러닝 프레임워크들을 도입하며 겪은 문제와 해결 과정에 대해서도 나눕니다. 연구 분야에는 Python 2.7 기반의 프레임워크들이 여전히 많습니다. 이러한 프레임워크 및 라이브러리의 지원을 위하여 Python 2 기반의 프레임워크와 Python 3.7로 구현한 컨테이너 인터페이스를 단일 컨테이너 환경에 중복 빌드 및 상호 간섭 없이 공존시키기 위해 개발한 아이디어를 소개합니다.
마지막으로 Python 기반의 프레임워크를 개발, 배포 및 상용화 하는 과정에서 겪은 다양한 어려움을 소개합니다. 솔루션을 배포 및 보급할 때 겪는 다양한 런타임, 하드웨어 환경 및 개인 정보 보호를 위한 폐쇄망 대상의 디플로이 등에 대응하기 위하여 Python 응용프로그램을 단독 실행용으로 패키징하는 과정에서 겪은 팁들을 설명합니다. 또한 GUI 빌드 및 Python, Go 및 C++을 함께 사용한 드라이버 가상화 레이어 개발 등의 내용도 살짝 다룹니다.
이 슬라이드는 PyCon KR 2019의 발표 슬라이드입니다. ( https://www.pycon.kr/program/talk-detail?id=138 )
[IoT] MAKE with Open H/W + Node.JS - 3rdPark Jonggun
IoT 시대에 Opensource H/W 와 NodeJS 를 이용하여 누구나 나만의 H/W + S/W + Service 를 만들기 위한 교육 과정을 만들어 보았습니다.
상상했던 아이디어를 Raspberry Pi 기반으로 나만의 IoT 제품을 현실로 만들어 보세요.
Lesson 1 - Introduction : IoT개요, Opensource H/W, 라즈베리파이 기초
Lesson 2 - Linux : Raspberry Pi 에서 리눅스 활용하기
Lesson 3 - Node.JS : Raspberry Pi 에서 Node.JS 로 프로그래밍 하기
Lesson 4 - Sensor : GPIO 를 Node.JS 로 동작시켜 센서 제어하기
Lesson 5 - Project : Raspberry Pi 로 스마트폰 + 무선 IoT 오디오 제작
챕터가 완성되는대로 추가적으로 공유하겠습니다.
Circulus Site - http://www.circul.us
Circulus Group - http://group.circul.us
[NDC16] (애드브릭스) 라이브마이그레이션 분투기 - 달리는 분석 툴의 바퀴를 갈아 끼워보자!Jeongsang Baek
애드브릭스는 모바일 앱 분석 솔루션으로, 많은 개발사들이 애드브릭스를 통해 앱의 성과를 지표화하여 분석하고 있습니다. 시간이 지나면서 사용자의 요구는 다양해졌고 분석해야 하는 앱의 개수는 폭발적으로 증가하였습니다. 그 결과 애드브릭스는 사용자에게 다양한 지표를 손쉽고 빠르게 고객에게 제공하기 위해 지속적인 서비스 아키텍쳐 재설계 및 데이터의 라이브 마이그레이션을 진행하였습니다.
이 세션은 폭발적으로 성장한 분석툴이 사용자의 다양한 요구사항을 만족시키기 위해 재설계한 아키텍쳐와 그 구현에 대해 설명하고 라이브 마이그레이션을 진행하며 얻은 경험과 인사이트를 공유합니다.
(GameTech2015) Live Operation by Adbrix의 Node.js와 MongoDB를 이용한 멀티테넌트 인프라 구축사례Jeongsang Baek
대부분의 중소 모바일 게임 업체는 앱을 잘 만들기에도 시간이 모자라 출시일을 잘 맞추기 급급한 상황이다. 그러다 보니 운영을 위한 툴은 소홀히 개발하는 경우가 대부분이고 운영 캠페인은 날림으로 개발하거나 그때 그때 개발자가 필요한 부분만 개발하기 일쑤다. 그러다보니 마케터는 결국 늘 개발자 눈치만 살피게 된다. 필자는 블루윈드에서 이러한 문제를 절감했고 '모바일 게임 개발사가 앱 개발에만 집중할 수 있게 해주고 싶다'는 IGAworks의 철학에 공감하여 라이브 오퍼레이션 프로젝트를 시작하게 되었다.
라이브 오퍼레이션의 개발 중점과제는 5가지였다. 첫번째, 다수의 개발사가 하나의 큰 클라우드 시스템을 사용하도록 multi-tenant 인프라를 구축해야 한다. 두번째, TCO(Total cost of ownership)를 최소화해야 한다. 세번째, 앱의 핵심유저를 실시간으로 그룹화하여 타게팅 캠페인을 할 수 있어야 한다. 네번째, 캠페인의 성과를 마케터에게 실시간으로 피드백해야 한다. 다섯째, 3개월 안에 정식 서비스가 되어야 한다는 점이었다. (왜 우리에게 주어지는 시간은 늘 3개월인가) 그리고 당연하지만 이 서비스를 혼자 개발해야 했다.
이 다섯가지 이슈를 해결하기 위하여 AWS 클라우드 상에 생산성과 성능이 검증된 node.js 와 mongodb를 이용하여 서비스 백엔드를 구성하였고, multi-tenant를 구성하기 위한 여러가지 고민과 그 해결책을 직접 구현하였다. 필자는 node.js와 mongodb를 사용해 본 경험이 충분하다 생각했지만 대규모 정식 서비스를 진행하며 많은 함정에 빠졌고 결국 해결했다.
이 발표를 통해 청강자는 node.js와 mongodb를 이용하여 multi-tenant 인프라를 구축해야 할 때 고려해야 할 설계 방식과 기술적인 고민, 그것에 대한 현실적인 해법을 얻을 수 있다.
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
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
13. 개발 시작
클라이언트 네트웍 라이브러리 : c++
– cURL 이용
– Xcode / ndk 에서 모두 빌드되어야 했음
– 개발하다 보니 windows에서도 빌드
서버 : node.js
– 개발은 windows 7 에서 짂행
– Windows 2008 Server R2 에서 실행
– 왜? 게임이 잘 되면 개발자 뽑기 쉬우라고…
• 근데 Windows 에선 안 되는 것이 맋다!
• 나중에 맋이 후회…
Page 13
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
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
38. 요약
퍼포먼스 때문에 node.js를 선택
– 실제 퍼포먼스 병목은 DB가 될 가능성이 높음
써드 파티 모듈들로 읶해 생산성을 향상
javascript로는 생산성을 향상시키지 못함
– node.lua도 괜찮을 듯
javascript로 안정적 서비스 하려면 무조건
TDD를 도입
– 언어 특성상 프로젝트가 커지면 핸들 하기 어려워집니다
코루틴이 필요하면 붙이면 됩니다
– 애드온 형태로 붙이셔도 됩니다
Page 38