1. MMO 와 SNG 의 컨버전스 :
프로젝트 S 로 살펴보는 서버전략
드래곤플라이 S 팀
김익중
2. 이 PPT 자료는 2013 년 4 월 24 일 넥슨에서 주최한
NDC 13 에서 발표한 것입니다 .
배포를 위해 수정된 부분들이 있으며
기술 내용의 권리는 드래곤플라이에 있습니다 .
3. About Me
- Game Developer
- NeowizGames, 네시삼십삼분
- Dragonfly
- Technical Director / Server Programmer
- http://rhea.pe.kr
- https://twitter.com/rheastrike
- 최근에는 콘텐츠보다 데이터 다루는 것에 재미를 붙였습니다 .
8. Session Storage Server
접속은 끊겨도 세션은 유지
- 게임 서버 기준으로 서버의 유령 유저 다수 존재
쿠키 표준안
- RFC 2109
- 쿠키는 300 개까지
- 최대 크기는 4,096 바이트
- 하나의 호스트나 도메인에서 최대 20 개
Front 서버를 믿지 말고 세션 저장 서버로 로긴 판단
14. Mercury Project
- node.js 를 기본으로 한 SNS 프로젝트
- PC/ 스마트 디바이스 동시 지원
Venus Project
-C++ 을 기본으로 한 재활용 가능한 MMO 콘텐츠 서버 프로젝트
-DB 의존성 최소화
-클라이언트 , 서버 동일한 콘텐츠 레이어 유지
Earth Project
- C# 을 기본으로 한 REST 서버
-Redis 를 이용한 Database Memory Cache 서버
Neptune Project
- SE, DBA 기쁨 프로젝트
19. Benchmark
Boost::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
20. Socket.IO
Node.js 의 소켓을 이용하여
“WebBrowser 에서” 실시간 네트워킹
net module vs. Socket.IO
- Websocket
- Smart Phone
- Rooms
WebBrowser 임베딩이냐 C/S 구현이냐 ?
21. 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
22. Native Problem
Win32 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 프로토콜 추가
27. Redis
Redis 와의 첫만남
- 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
)
??????
34. Socket.IO
I/O 문제 해결
PC 와 스마트 디바이스 동시해결
But,
- node.js 가 싱글 쓰레드
- 빈약한 자료구조 , C++ 에 비해 부족한 함수
- 재연결시 세션 문제는 여전히 존재
- 카톡 , 라인과 같은 프로토콜로 대체
- 혹은 아예 새로운 RFC 를 ?
남는 CPU 를 다른 서버 자
원으로 쓸수 없을까 ?
MPI, MP
남는 CPU 를 다른 서버 자
원으로 쓸수 없을까 ?
MPI, MP
38. Database Caching
보이는 것과 보이지 않는 것
서버 구분은 서버가 아니라 DB 이야기
- SNS 등장 이후 기술적 화두는 전부 캐시 구성 이야기
DB 캐시 서버가 견딘다면 One World 는 자동 해결된다 .
- Cache + Big Data + Session Storage + Logic
43. Strategy & Tech
게임은 [ 쓰기 ] 가 압도적으로 많다 .
-아이템과 머니 때문임
그냥 NoSQL 로 밀어버릴까 ?
-트랜잭션은 누가 책임 ?
메모리 DB 를 만들자
-COM+
-ADO.NET 의 DataSet
-Linq
-201X 년에도 이런 짓을 ?
VS
.
44. Memcached vs. Redis
이미 질렀으니 Redis
- 스펙비교는 각자 살펴보세요 .
- 오직 Hash 테이블만 사용
- Expires
어차피 프로그램은 필요하다 .
- C++ vs. C#
- Hiredis vs. ServiceStack.Redis vs. BookSleeve
- 직관적인 클라이언트 라이브러리 때문에 C# + BookSleeve 선택
- with Linq + JSON
- C# 용 클라이언트 라이브러리 직접 만들 계획
45. Database Caching
Why?
- 우리들은 프로그래머니까 .
- 비용절감
- 도전하고 싶어서 .
- 먹고 사는데 도움이 될꺼야…
DatabaseDatabase
ClientClient
Cache
Server
Cache
Server
쓰기
복제
읽기
46. Caching strategy
-인력세팅에 따른 사용법 고안 : 우린 DBA 가 있어요 ~
작업 중에 DB 에
새 쿼리가 필요하
다
작업 중에 DB 에
새 쿼리가 필요하
다
DBA 에게 쿼리를
요청한다
DBA 에게 쿼리를
요청한다
DBA 에게 쿼리를
받는다
DBA 에게 쿼리를
받는다
캐시 서버에 SP 를
등록한다
캐시 서버에 SP 를
등록한다
캐시 서버에 JSON
형태로 요청한다
캐시 서버에 JSON
형태로 요청한다
캐시 서버는 자신이 갖고
있으면 그대로 응답하며
없으면
DB 에게 질의해 돌려준
다 .
Write 는 캐시 갱신후
DB 반영
캐시 서버는 자신이 갖고
있으면 그대로 응답하며
없으면
DB 에게 질의해 돌려준
다 .
Write 는 캐시 갱신후
DB 반영
48. Caching sharding
성능은 맛봤으니 이제 Scale up 할 차례
- 아직 Redis 는 Cluster 가 불가능 , 오직 Master/Slave 복제만 가능
- ZooKeeper, Sentinel 고려
- 대기표 시스템 , 정확한 실시간이 아닐 경우 , 고장감래…
애당초 게임을 위한 솔루션들은 아니었다
49. Caching sharding
Cache
Server 1
Cache
Server 1
Cache
Server 3
Cache
Server 3
Cache
Server 2
Cache
Server 2
Cache
Server
n
Cache
Server
n
Redis 1Redis 1
Redis 3Redis 3
Redis 2Redis 2
Redis
n
Redis
n
Game
Server 1
Game
Server 1
Game
Server 3
Game
Server 3
Game
Server 2
Game
Server 2
Game
Server
n
Game
Server
n
ProxyProxy
Sharding
Manager
Sharding
Manager
Redis
1
Redis
1
Redis
3
Redis
3
Redis
2
Redis
2
Redis
n
Redis
n
53. FireWallFireWallREST API
- 내부 / 외부 포트를 나누어 사용
- ADO 대신 Cache Server 를 이용
- Client 는 SSL 을 지원해야함
ClientClient
Web
Server
Web
Server
Other
Server
Other
Server
Port 443
STS/
Cache
Server
STS/
Cache
Server
Port XXX
54. Conclusion
최근 쏟아지는 기술들중 필요한 것들만 챙기면 됩니다 .
MMO 가 아니라 SNG 라면 REST 구조만 들고가도 됩니다 .
어떤 서버에서 작업하든 Socket/HTTP 로 변환가능해야 합니다 .