56
MMO 와 SNG 와 와와와와 : 와와와와 S 와 와와와와 와와와와 와와와와와와 S 와 와와와

Rhea_MMO_SNG_Convergence_Server_Architecture

Embed Size (px)

DESCRIPTION

이 PPT 자료는 2013년 4월 24일 넥슨에서 주최한 NDC 13에서 발표한 것입니다. 배포를 위해 수정된 부분들이 있으며 기술 내용의 권리는 드래곤플라이에 있습니다. ※ 2013. 4.26 폰트수정

Citation preview

Page 1: Rhea_MMO_SNG_Convergence_Server_Architecture

MMO 와 SNG 의 컨버전스 : 프로젝트 S 로 살펴보는 서버전략드래곤플라이 S 팀김익중

Page 2: Rhea_MMO_SNG_Convergence_Server_Architecture

이 PPT 자료는 2013 년 4 월 24 일 넥슨에서 주최한NDC 13 에서 발표한 것입니다 .

배포를 위해 수정된 부분들이 있으며기술 내용의 권리는 드래곤플라이에 있습니다 .

Page 3: Rhea_MMO_SNG_Convergence_Server_Architecture

About Me

- Game Developer- NeowizGames, 네시삼십삼분- Dragonfly- Technical Director / Server Programmer- http://rhea.pe.kr- https://twitter.com/rheastrike- 최근에는 콘텐츠보다 데이터 다루는 것에 재미를 붙였습니다 .

Page 4: Rhea_MMO_SNG_Convergence_Server_Architecture

1. 자유를 위한 계획

Page 5: Rhea_MMO_SNG_Convergence_Server_Architecture
Page 6: Rhea_MMO_SNG_Convergence_Server_Architecture
Page 7: Rhea_MMO_SNG_Convergence_Server_Architecture

Tragedy of WIFI & 3G(or LTE)

Page 8: Rhea_MMO_SNG_Convergence_Server_Architecture

Session Storage Server

접속은 끊겨도 세션은 유지- 게임 서버 기준으로 서버의 유령 유저 다수 존재

쿠키 표준안- RFC 2109- 쿠키는 300 개까지- 최대 크기는 4,096 바이트- 하나의 호스트나 도메인에서 최대 20 개

Front 서버를 믿지 말고 세션 저장 서버로 로긴 판단

Page 9: Rhea_MMO_SNG_Convergence_Server_Architecture

Session Storage Server

Server 1

Server 1

Server2

Server2

Server…n

Server…n

STSSTS

Business TierBusiness Tier

1) 접속 , 로긴

2) 세션 검증

3) 로긴 /재로긴 OK

4) 일반 작업 수행

Page 10: Rhea_MMO_SNG_Convergence_Server_Architecture

REST based Comet- Representational state transfer- 이럴봐엔 차라리 Comet 을 쓰겠어 !

Page 11: Rhea_MMO_SNG_Convergence_Server_Architecture

게임에 Comet 이 말이 되냐 ?

- 신조어 , 비동기 게임 기획자 용어

SNGSNG

Page 12: Rhea_MMO_SNG_Convergence_Server_Architecture

Back to the PC-Online

Page 13: Rhea_MMO_SNG_Convergence_Server_Architecture

WebSocket

Page 14: Rhea_MMO_SNG_Convergence_Server_Architecture

Mercury Project- node.js 를 기본으로 한 SNS 프로젝트- PC/ 스마트 디바이스 동시 지원

Venus Project-C++ 을 기본으로 한 재활용 가능한 MMO 콘텐츠 서버 프로젝트-DB 의존성 최소화-클라이언트 , 서버 동일한 콘텐츠 레이어 유지

Earth Project- C# 을 기본으로 한 REST 서버-Redis 를 이용한 Database Memory Cache 서버

Neptune Project- SE, DBA 기쁨 프로젝트

Page 15: Rhea_MMO_SNG_Convergence_Server_Architecture

Architecture

SwitchServerSwitchServer

LobbyLobby

ChatServerChat

Server

Non-RealtimeServer

Non-RealtimeServer

STS/DB

Cache

STS/DB

CacheDatabaseDatabase

RealtimeGame Server

RealtimeGame Server

PCClient

PCClient

Smart DeviceClient

Smart DeviceClient

REST

RESTREST

WebSocket

Page 16: Rhea_MMO_SNG_Convergence_Server_Architecture

2. Mercury Project

Page 17: Rhea_MMO_SNG_Convergence_Server_Architecture

node.js

Node.jsNode.jsCommon ServerCommon Server

C++ or C#IOCP Model

Lua, PythonScript EngineBy C++

Script Engine Based

Contents

libuv

V8JavaScript

Engine

JavaScript Based

Contents

Page 18: Rhea_MMO_SNG_Convergence_Server_Architecture

IOCP: node.jsI/O Complete Port

Page 19: Rhea_MMO_SNG_Convergence_Server_Architecture

BenchmarkBoost::Asio vs. Node.js

메모리를 더 차지하나 속력은 만족- V8 의 메모리

총 데이터 (Recv/Send) : 516,000,000/516,000,000

시도 서버 연결 개수 메모리 (Max) CPU(Max) 스레드 서버 총 처리 시간 클라 총 Send 시간 클라 총 Recv 시간

1 차Asio 1000 276,544 25 2 0:55 0:39 0:54

Node 1000 665,004 12 3 1:04 1:02 1:07

2 차Asio 1000 276,496 25 2 0:57 0:40 0:55

Node 1000 664,596 12 4 1:05 1:02 1:06

3 차Asio 1000 276,420 25 2 1:05 0:45 1:02

Node 1000 662,024 13 4 1:16 1:14 1:20

Page 20: Rhea_MMO_SNG_Convergence_Server_Architecture

Socket.IONode.js 의 소켓을 이용하여“WebBrowser 에서” 실시간 네트워킹

net module vs. Socket.IO- Websocket- Smart Phone- Rooms

WebBrowser 임베딩이냐 C/S 구현이냐 ?

Page 21: Rhea_MMO_SNG_Convergence_Server_Architecture

Socket.IO벤치마킹- CPU E5-2650 2.00Ghz(2 processors)- 4.00 GB- x64 Windwos Server- 153byte Echo test

접속수 2253 3257 4053초당 에코성공 1690 2178 2681초당 에코성공 1741 2174 2612초당 에코성공 1684 2225 2225

Page 22: Rhea_MMO_SNG_Convergence_Server_Architecture

Native ProblemWin32 Client 에서는 어떻게 받지 ?

- WebSocket 을 C/C++ 로 구현- RFC 6455 및 Socket.IO 프로토콜 직접 구현

1) 서버 접속2) Session ID 와 Transport ID 받음3) Socket 혹은 XMLHTTPRequest 로 받을 것인지 선택4) XMLHTTPRequest 라면 클라이언트가 계속 폴링5) Socket 이라면 새 Transport 연결 획득6) 지정된 시간만큼 핸드쉐이킹7) Socket.IO 프로토콜 추가

1) 서버 접속2) Session ID 와 Transport ID 받음3) Socket 혹은 XMLHTTPRequest 로 받을 것인지 선택4) XMLHTTPRequest 라면 클라이언트가 계속 폴링5) Socket 이라면 새 Transport 연결 획득6) 지정된 시간만큼 핸드쉐이킹7) Socket.IO 프로토콜 추가

Page 23: Rhea_MMO_SNG_Convergence_Server_Architecture

Websocket ProtocolGET /mychat HTTP/1.1Host: server.example.comUpgrade: websocketConnection: UpgradeSec-WebSocket-Key: x3JJHMbDL1EzLkh9GBhXDw==Sec-WebSocket-Protocol: chatSec-WebSocket-Version: 13Origin: http://example.com

GET /mychat HTTP/1.1Host: server.example.comUpgrade: websocketConnection: UpgradeSec-WebSocket-Key: x3JJHMbDL1EzLkh9GBhXDw==Sec-WebSocket-Protocol: chatSec-WebSocket-Version: 13Origin: http://example.com

Page 24: Rhea_MMO_SNG_Convergence_Server_Architecture

Websocket ProtocolSocket.IO 클라이언트 (js) 가 하는 일

Page 25: Rhea_MMO_SNG_Convergence_Server_Architecture

Websocket Protocol

Page 26: Rhea_MMO_SNG_Convergence_Server_Architecture

CalorisSocket.IO 용 Win32 C++ 클라이언트 라이브러리-https://github.com/RheaStrike/Caloris

Page 27: Rhea_MMO_SNG_Convergence_Server_Architecture

RedisRedis 와의 첫만남- node.js 의 Scale up- 서로 다른 node.js 서버에 접속한 유저들끼리의 통신- Scale up 은 전통적인 웹개발자들에게 최대의 난관

CMN1(node.js/

Socket.IO)

CMN1(node.js/

Socket.IO)

CMN2(node.js/

Socket.IO)

CMN2(node.js/

Socket.IO)

??????

Page 28: Rhea_MMO_SNG_Convergence_Server_Architecture

MS Open Tech

Page 29: Rhea_MMO_SNG_Convergence_Server_Architecture

IOCP: Redis

Page 30: Rhea_MMO_SNG_Convergence_Server_Architecture

Pub/SubSocket.IO 의 친구 Redis동접의 증가를 고려

Page 31: Rhea_MMO_SNG_Convergence_Server_Architecture

Architecture

SwitchServerSwitchServer

LobbyLobby

ChatServerChat

Server

WebServerWeb

ServerSTS/DB

Cache

STS/DB

CacheDatabaseDatabase

RealtimeGame Server

RealtimeGame Server

PCClient

PCClient

Smart DeviceClient

Smart DeviceClient

REST

RESTREST

WebSocket

Page 32: Rhea_MMO_SNG_Convergence_Server_Architecture

Basic Community System

CMN1(node.js

/ Socket.IO)

CMN1(node.js

/ Socket.IO)

CMN2(node.js

/ Socket.IO)

CMN2(node.js

/ Socket.IO)

CBS(Redis)

CBS(Redis)

Push Gateway(C#)

Push Gateway(C#)

Page 33: Rhea_MMO_SNG_Convergence_Server_Architecture

Demo

Page 34: Rhea_MMO_SNG_Convergence_Server_Architecture

Socket.IOI/O 문제 해결PC 와 스마트 디바이스 동시해결

But,- node.js 가 싱글 쓰레드- 빈약한 자료구조 , C++ 에 비해 부족한 함수- 재연결시 세션 문제는 여전히 존재

- 카톡 , 라인과 같은 프로토콜로 대체- 혹은 아예 새로운 RFC 를 ?

남는 CPU 를 다른 서버 자원으로 쓸수 없을까 ?

MPI, MP

남는 CPU 를 다른 서버 자원으로 쓸수 없을까 ?

MPI, MP

Page 35: Rhea_MMO_SNG_Convergence_Server_Architecture

3. Earth Project

Page 36: Rhea_MMO_SNG_Convergence_Server_Architecture

One World목표 : 서버 구분이 없는 SNS 커뮤니티

그런데 기존 온라인 게임 말고는 전부 구분이 없다 .

내가 SNS 를 하는 이유는 트잉여가 아니라 서버 분석 때문이다아~~~!!!

Page 37: Rhea_MMO_SNG_Convergence_Server_Architecture

One World

Page 38: Rhea_MMO_SNG_Convergence_Server_Architecture

Database Caching

보이는 것과 보이지 않는 것

서버 구분은 서버가 아니라 DB 이야기- SNS 등장 이후 기술적 화두는 전부 캐시 구성 이야기

DB 캐시 서버가 견딘다면 One World 는 자동 해결된다 .- Cache + Big Data + Session Storage + Logic

Page 39: Rhea_MMO_SNG_Convergence_Server_Architecture

Architecture

수비 믿고 던지면 안 되지네가 잡아야지

네가 이겨야 한다이 타자를 무조건 잡아야 한다

삼진으로 무조건 잡아야 한다이런 생각으로

Page 40: Rhea_MMO_SNG_Convergence_Server_Architecture

Architecture

SwitchServerSwitchServer

LobbyLobby

ChatServerChat

Server

WebServerWeb

ServerSTS/DB

Cache

STS/DB

CacheDatabaseDatabase

RealtimeGame Server

RealtimeGame Server

PCClient

PCClient

Smart DeviceClient

Smart DeviceClient

REST

RESTREST

WebSocket

Page 41: Rhea_MMO_SNG_Convergence_Server_Architecture

Database Partitioning눈팅 위주의 평범한 게시판

ClientClientDatabaseDatabase

DatabaseDatabase DatabaseDatabase DatabaseDatabase

쓰기

복제읽기

Page 42: Rhea_MMO_SNG_Convergence_Server_Architecture

Database PartitioningDatabase

1Database

1

Database 3

Database 3

Database 2

Database 2ClientClient

Dic.Dic.어디에 있니 ?

3번에 있어

Page 43: Rhea_MMO_SNG_Convergence_Server_Architecture

Strategy & Tech게임은 [ 쓰기 ] 가 압도적으로 많다 .-아이템과 머니 때문임

그냥 NoSQL 로 밀어버릴까 ?-트랜잭션은 누가 책임 ?

메모리 DB 를 만들자-COM+-ADO.NET 의 DataSet-Linq-201X 년에도 이런 짓을 ?

VS.

Page 44: Rhea_MMO_SNG_Convergence_Server_Architecture

Memcached vs. Redis이미 질렀으니 Redis- 스펙비교는 각자 살펴보세요 .- 오직 Hash 테이블만 사용- Expires

어차피 프로그램은 필요하다 .- C++ vs. C#- Hiredis vs. ServiceStack.Redis vs. BookSleeve

- 직관적인 클라이언트 라이브러리 때문에 C# + BookSleeve 선택- with Linq + JSON- C# 용 클라이언트 라이브러리 직접 만들 계획

Page 45: Rhea_MMO_SNG_Convergence_Server_Architecture

Database CachingWhy?- 우리들은 프로그래머니까 .- 비용절감- 도전하고 싶어서 .- 먹고 사는데 도움이 될꺼야…

DatabaseDatabase

ClientClient

CacheServerCacheServer

쓰기

복제

읽기

Page 46: Rhea_MMO_SNG_Convergence_Server_Architecture

Caching strategy -인력세팅에 따른 사용법 고안 : 우린 DBA 가 있어요~

작업 중에 DB 에 새 쿼리가 필요하다

작업 중에 DB 에 새 쿼리가 필요하다

DBA 에게 쿼리를 요청한다

DBA 에게 쿼리를 요청한다

DBA 에게 쿼리를 받는다

DBA 에게 쿼리를 받는다

캐시 서버에 SP 를 등록한다

캐시 서버에 SP 를 등록한다

캐시 서버에 JSON 형태로 요청한다

캐시 서버에 JSON 형태로 요청한다

캐시 서버는 자신이 갖고 있으면 그대로 응답하며

없으면DB 에게 질의해 돌려준다 .

Write 는 캐시 갱신후 DB 반영

캐시 서버는 자신이 갖고 있으면 그대로 응답하며

없으면DB 에게 질의해 돌려준다 .

Write 는 캐시 갱신후 DB 반영

Page 47: Rhea_MMO_SNG_Convergence_Server_Architecture

Caching sharding

Page 48: Rhea_MMO_SNG_Convergence_Server_Architecture

Caching sharding성능은 맛봤으니 이제 Scale up할 차례- 아직 Redis 는 Cluster 가 불가능 , 오직 Master/Slave 복제만 가능- ZooKeeper, Sentinel 고려- 대기표 시스템 , 정확한 실시간이 아닐 경우 , 고장감래…

애당초 게임을 위한 솔루션들은 아니었다

Page 49: Rhea_MMO_SNG_Convergence_Server_Architecture

Caching sharding

CacheServer 1Cache

Server 1

CacheServer 3Cache

Server 3

CacheServer 2Cache

Server 2

CacheServer

n

CacheServer

n

Redis 1Redis 1

Redis 3Redis 3

Redis 2Redis 2

Redisn

Redisn

Game Server 1

Game Server 1

Game Server 3

Game Server 3

Game Server 2

Game Server 2

GameServer

n

GameServer

n

ProxyProxyShardingManagerShardingManager

Redis 1

Redis 1

Redis 3

Redis 3

Redis 2

Redis 2

Redisn

Redisn

Page 50: Rhea_MMO_SNG_Convergence_Server_Architecture

Architecture

SwitchServerSwitchServer

LobbyLobby

ChatServerChat

Server

WebServerWeb

ServerSTS/DB

Cache

STS/DB

CacheDatabaseDatabase

RealtimeGame Server

RealtimeGame Server

PCClient

PCClient

Smart DeviceClient

Smart DeviceClient

REST

RESTREST

WebSocket

Page 51: Rhea_MMO_SNG_Convergence_Server_Architecture

REST APIASP.NET- 왜죠 ?

Page 52: Rhea_MMO_SNG_Convergence_Server_Architecture

REST API- GET 서버와 POST 서버의 분리

Page 53: Rhea_MMO_SNG_Convergence_Server_Architecture

FireWallFireWallREST API- 내부 /외부 포트를 나누어 사용- ADO 대신 Cache Server 를 이용- Client 는 SSL 을 지원해야함

ClientClient WebServerWeb

Server

OtherServerOtherServer

Port 443

STS/CacheServer

STS/CacheServer

Port XXX

Page 54: Rhea_MMO_SNG_Convergence_Server_Architecture

Conclusion

최근 쏟아지는 기술들중 필요한 것들만 챙기면 됩니다 .

MMO 가 아니라 SNG 라면 REST 구조만 들고가도 됩니다 .

어떤 서버에서 작업하든 Socket/HTTP 로 변환가능해야 합니다 .

Page 55: Rhea_MMO_SNG_Convergence_Server_Architecture

Conclusion

Page 56: Rhea_MMO_SNG_Convergence_Server_Architecture

참고자료-http://helloworld.naver.com/helloworld/233847-http://helloworld.naver.com/helloworld/294797-http://oldblog.antirez.com/post/redis-as-LRU-cache.html-http://www.slideshare.net/ryanlecompte/handling-redis-failover-with-zookeeper