Upload
rhea-strike
View
7.733
Download
1
Embed Size (px)
DESCRIPTION
이 PPT 자료는 2013년 4월 24일 넥슨에서 주최한 NDC 13에서 발표한 것입니다. 배포를 위해 수정된 부분들이 있으며 기술 내용의 권리는 드래곤플라이에 있습니다. ※ 2013. 4.26 폰트수정
Citation preview
MMO 와 SNG 의 컨버전스 : 프로젝트 S 로 살펴보는 서버전략드래곤플라이 S 팀김익중
이 PPT 자료는 2013 년 4 월 24 일 넥슨에서 주최한NDC 13 에서 발표한 것입니다 .
배포를 위해 수정된 부분들이 있으며기술 내용의 권리는 드래곤플라이에 있습니다 .
About Me
- Game Developer- NeowizGames, 네시삼십삼분- Dragonfly- Technical Director / Server Programmer- http://rhea.pe.kr- https://twitter.com/rheastrike- 최근에는 콘텐츠보다 데이터 다루는 것에 재미를 붙였습니다 .
1. 자유를 위한 계획
Tragedy of WIFI & 3G(or LTE)
Session Storage Server
접속은 끊겨도 세션은 유지- 게임 서버 기준으로 서버의 유령 유저 다수 존재
쿠키 표준안- RFC 2109- 쿠키는 300 개까지- 최대 크기는 4,096 바이트- 하나의 호스트나 도메인에서 최대 20 개
Front 서버를 믿지 말고 세션 저장 서버로 로긴 판단
Session Storage Server
Server 1
Server 1
Server2
Server2
Server…n
Server…n
STSSTS
Business TierBusiness Tier
1) 접속 , 로긴
2) 세션 검증
3) 로긴 /재로긴 OK
4) 일반 작업 수행
REST based Comet- Representational state transfer- 이럴봐엔 차라리 Comet 을 쓰겠어 !
게임에 Comet 이 말이 되냐 ?
- 신조어 , 비동기 게임 기획자 용어
SNGSNG
Back to the PC-Online
WebSocket
Mercury Project- node.js 를 기본으로 한 SNS 프로젝트- PC/ 스마트 디바이스 동시 지원
Venus Project-C++ 을 기본으로 한 재활용 가능한 MMO 콘텐츠 서버 프로젝트-DB 의존성 최소화-클라이언트 , 서버 동일한 콘텐츠 레이어 유지
Earth Project- C# 을 기본으로 한 REST 서버-Redis 를 이용한 Database Memory Cache 서버
Neptune Project- SE, DBA 기쁨 프로젝트
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
2. Mercury Project
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
IOCP: node.jsI/O Complete Port
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
Socket.IONode.js 의 소켓을 이용하여“WebBrowser 에서” 실시간 네트워킹
net module vs. Socket.IO- Websocket- Smart Phone- Rooms
WebBrowser 임베딩이냐 C/S 구현이냐 ?
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
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 프로토콜 추가
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
Websocket ProtocolSocket.IO 클라이언트 (js) 가 하는 일
Websocket Protocol
CalorisSocket.IO 용 Win32 C++ 클라이언트 라이브러리-https://github.com/RheaStrike/Caloris
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)
??????
MS Open Tech
IOCP: Redis
Pub/SubSocket.IO 의 친구 Redis동접의 증가를 고려
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
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#)
Demo
Socket.IOI/O 문제 해결PC 와 스마트 디바이스 동시해결
But,- node.js 가 싱글 쓰레드- 빈약한 자료구조 , C++ 에 비해 부족한 함수- 재연결시 세션 문제는 여전히 존재
- 카톡 , 라인과 같은 프로토콜로 대체- 혹은 아예 새로운 RFC 를 ?
남는 CPU 를 다른 서버 자원으로 쓸수 없을까 ?
MPI, MP
남는 CPU 를 다른 서버 자원으로 쓸수 없을까 ?
MPI, MP
3. Earth Project
One World목표 : 서버 구분이 없는 SNS 커뮤니티
그런데 기존 온라인 게임 말고는 전부 구분이 없다 .
내가 SNS 를 하는 이유는 트잉여가 아니라 서버 분석 때문이다아~~~!!!
One World
Database Caching
보이는 것과 보이지 않는 것
서버 구분은 서버가 아니라 DB 이야기- SNS 등장 이후 기술적 화두는 전부 캐시 구성 이야기
DB 캐시 서버가 견딘다면 One World 는 자동 해결된다 .- Cache + Big Data + Session Storage + Logic
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
Database Partitioning눈팅 위주의 평범한 게시판
ClientClientDatabaseDatabase
DatabaseDatabase DatabaseDatabase DatabaseDatabase
쓰기
복제읽기
Database PartitioningDatabase
1Database
1
Database 3
Database 3
Database 2
Database 2ClientClient
Dic.Dic.어디에 있니 ?
3번에 있어
Strategy & Tech게임은 [ 쓰기 ] 가 압도적으로 많다 .-아이템과 머니 때문임
그냥 NoSQL 로 밀어버릴까 ?-트랜잭션은 누가 책임 ?
메모리 DB 를 만들자-COM+-ADO.NET 의 DataSet-Linq-201X 년에도 이런 짓을 ?
VS.
Memcached vs. Redis이미 질렀으니 Redis- 스펙비교는 각자 살펴보세요 .- 오직 Hash 테이블만 사용- Expires
어차피 프로그램은 필요하다 .- C++ vs. C#- Hiredis vs. ServiceStack.Redis vs. BookSleeve
- 직관적인 클라이언트 라이브러리 때문에 C# + BookSleeve 선택- with Linq + JSON- C# 용 클라이언트 라이브러리 직접 만들 계획
Database CachingWhy?- 우리들은 프로그래머니까 .- 비용절감- 도전하고 싶어서 .- 먹고 사는데 도움이 될꺼야…
DatabaseDatabase
ClientClient
CacheServerCacheServer
쓰기
복제
읽기
Caching strategy -인력세팅에 따른 사용법 고안 : 우린 DBA 가 있어요~
작업 중에 DB 에 새 쿼리가 필요하다
작업 중에 DB 에 새 쿼리가 필요하다
DBA 에게 쿼리를 요청한다
DBA 에게 쿼리를 요청한다
DBA 에게 쿼리를 받는다
DBA 에게 쿼리를 받는다
캐시 서버에 SP 를 등록한다
캐시 서버에 SP 를 등록한다
캐시 서버에 JSON 형태로 요청한다
캐시 서버에 JSON 형태로 요청한다
캐시 서버는 자신이 갖고 있으면 그대로 응답하며
없으면DB 에게 질의해 돌려준다 .
Write 는 캐시 갱신후 DB 반영
캐시 서버는 자신이 갖고 있으면 그대로 응답하며
없으면DB 에게 질의해 돌려준다 .
Write 는 캐시 갱신후 DB 반영
Caching sharding
Caching sharding성능은 맛봤으니 이제 Scale up할 차례- 아직 Redis 는 Cluster 가 불가능 , 오직 Master/Slave 복제만 가능- ZooKeeper, Sentinel 고려- 대기표 시스템 , 정확한 실시간이 아닐 경우 , 고장감래…
애당초 게임을 위한 솔루션들은 아니었다
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
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
REST APIASP.NET- 왜죠 ?
REST API- GET 서버와 POST 서버의 분리
FireWallFireWallREST API- 내부 /외부 포트를 나누어 사용- ADO 대신 Cache Server 를 이용- Client 는 SSL 을 지원해야함
ClientClient WebServerWeb
Server
OtherServerOtherServer
Port 443
STS/CacheServer
STS/CacheServer
Port XXX
Conclusion
최근 쏟아지는 기술들중 필요한 것들만 챙기면 됩니다 .
MMO 가 아니라 SNG 라면 REST 구조만 들고가도 됩니다 .
어떤 서버에서 작업하든 Socket/HTTP 로 변환가능해야 합니다 .
Conclusion
참고자료-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