Rhea_MMO_SNG_Convergence_Server_Architecture

8,144 views

Published on

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

※ 2013. 4.26 폰트수정

Published in: Technology
2 Comments
20 Likes
Statistics
Notes
No Downloads
Views
Total views
8,144
On SlideShare
0
From Embeds
0
Number of Embeds
4,654
Actions
Shares
0
Downloads
85
Comments
2
Likes
20
Embeds 0
No embeds

No notes for slide

Rhea_MMO_SNG_Convergence_Server_Architecture

  1. 1. MMO 와 SNG 의 컨버전스 :프로젝트 S 로 살펴보는 서버전략드래곤플라이 S 팀김익중
  2. 2. 이 PPT 자료는 2013 년 4 월 24 일 넥슨에서 주최한NDC 13 에서 발표한 것입니다 .배포를 위해 수정된 부분들이 있으며기술 내용의 권리는 드래곤플라이에 있습니다 .
  3. 3. About Me- Game Developer- NeowizGames, 네시삼십삼분- Dragonfly- Technical Director / Server Programmer- http://rhea.pe.kr- https://twitter.com/rheastrike- 최근에는 콘텐츠보다 데이터 다루는 것에 재미를 붙였습니다 .
  4. 4. 1. 자유를 위한 계획
  5. 5. Tragedy of WIFI & 3G(or LTE)
  6. 6. Session Storage Server접속은 끊겨도 세션은 유지- 게임 서버 기준으로 서버의 유령 유저 다수 존재쿠키 표준안- RFC 2109- 쿠키는 300 개까지- 최대 크기는 4,096 바이트- 하나의 호스트나 도메인에서 최대 20 개Front 서버를 믿지 말고 세션 저장 서버로 로긴 판단
  7. 7. Session Storage ServerServer1Server1Server2Server2Server…nServer…nSTSSTSBusiness TierBusiness Tier1) 접속 , 로긴2) 세션 검증3) 로긴 / 재로긴 OK4) 일반 작업 수행
  8. 8. REST based Comet- Representational state transfer- 이럴봐엔 차라리 Comet 을 쓰겠어 !
  9. 9. 게임에 Comet 이 말이 되냐 ?- 신조어 , 비동기 게임 기획자 용어SNGSNG
  10. 10. Back to the PC-Online
  11. 11. WebSocket
  12. 12. Mercury Project- node.js 를 기본으로 한 SNS 프로젝트- PC/ 스마트 디바이스 동시 지원Venus Project-C++ 을 기본으로 한 재활용 가능한 MMO 콘텐츠 서버 프로젝트-DB 의존성 최소화-클라이언트 , 서버 동일한 콘텐츠 레이어 유지Earth Project- C# 을 기본으로 한 REST 서버-Redis 를 이용한 Database Memory Cache 서버Neptune Project- SE, DBA 기쁨 프로젝트
  13. 13. ArchitectureSwitchServerSwitchServerLobbyLobbyChatServerChatServerNon-RealtimeServerNon-RealtimeServerSTS/DBCacheSTS/DBCacheDatabaseDatabaseRealtimeGameServerRealtimeGameServerPCClientPCClientSmartDeviceClientSmartDeviceClientRESTRESTRESTWebSocket
  14. 14. 2. Mercury Project
  15. 15. node.jsNode.jsNode.jsCommon ServerCommon ServerC++ or C#IOCP ModelLua, PythonScript EngineBy C++Script EngineBasedContentslibuvV8JavaScriptEngineJavaScriptBasedContents
  16. 16. IOCP: node.jsI/O Complete Port
  17. 17. 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:54Node 1000 665,004 12 3 1:04 1:02 1:072 차Asio 1000 276,496 25 2 0:57 0:40 0:55Node 1000 664,596 12 4 1:05 1:02 1:063 차Asio 1000 276,420 25 2 1:05 0:45 1:02Node 1000 662,024 13 4 1:16 1:14 1:20
  18. 18. Socket.IONode.js 의 소켓을 이용하여“WebBrowser 에서” 실시간 네트워킹net module vs. Socket.IO- Websocket- Smart Phone- RoomsWebBrowser 임베딩이냐 C/S 구현이냐 ?
  19. 19. 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
  20. 20. 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 프로토콜 추가
  21. 21. Websocket ProtocolGET /mychat HTTP/1.1Host: server.example.comUpgrade: websocketConnection: UpgradeSec-WebSocket-Key:x3JJHMbDL1EzLkh9GBhXDw==Sec-WebSocket-Protocol: chatSec-WebSocket-Version: 13Origin: http://example.comGET /mychat HTTP/1.1Host: server.example.comUpgrade: websocketConnection: UpgradeSec-WebSocket-Key:x3JJHMbDL1EzLkh9GBhXDw==Sec-WebSocket-Protocol: chatSec-WebSocket-Version: 13Origin: http://example.com
  22. 22. Websocket ProtocolSocket.IO 클라이언트 (js) 가 하는 일
  23. 23. Websocket Protocol
  24. 24. CalorisSocket.IO 용 Win32 C++ 클라이언트 라이브러리-https://github.com/RheaStrike/Caloris
  25. 25. 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)??????
  26. 26. MS Open Tech
  27. 27. IOCP: Redis
  28. 28. Pub/SubSocket.IO 의 친구 Redis동접의 증가를 고려
  29. 29. ArchitectureSwitchServerSwitchServerLobbyLobbyChatServerChatServerWebServerWebServerSTS/DBCacheSTS/DBCacheDatabaseDatabaseRealtimeGameServerRealtimeGameServerPCClientPCClientSmartDeviceClientSmartDeviceClientRESTRESTRESTWebSocket
  30. 30. Basic Community SystemCMN1(node.js/ Socket.IO)CMN1(node.js/ Socket.IO)CMN2(node.js/ Socket.IO)CMN2(node.js/ Socket.IO)CBS(Redis)CBS(Redis)PushGateway(C#)PushGateway(C#)
  31. 31. Demo
  32. 32. Socket.IOI/O 문제 해결PC 와 스마트 디바이스 동시해결But,- node.js 가 싱글 쓰레드- 빈약한 자료구조 , C++ 에 비해 부족한 함수- 재연결시 세션 문제는 여전히 존재- 카톡 , 라인과 같은 프로토콜로 대체- 혹은 아예 새로운 RFC 를 ?남는 CPU 를 다른 서버 자원으로 쓸수 없을까 ?MPI, MP남는 CPU 를 다른 서버 자원으로 쓸수 없을까 ?MPI, MP
  33. 33. 3. Earth Project
  34. 34. One World목표 : 서버 구분이 없는 SNS 커뮤니티그런데 기존 온라인 게임 말고는 전부 구분이 없다 .내가 SNS 를 하는 이유는 트잉여가 아니라 서버 분석 때문이다아 ~~~!!!
  35. 35. One World
  36. 36. Database Caching보이는 것과 보이지 않는 것서버 구분은 서버가 아니라 DB 이야기- SNS 등장 이후 기술적 화두는 전부 캐시 구성 이야기DB 캐시 서버가 견딘다면 One World 는 자동 해결된다 .- Cache + Big Data + Session Storage + Logic
  37. 37. Architecture수비 믿고 던지면 안 되지네가 잡아야지네가 이겨야 한다이 타자를 무조건 잡아야 한다삼진으로 무조건 잡아야 한다이런 생각으로
  38. 38. ArchitectureSwitchServerSwitchServerLobbyLobbyChatServerChatServerWebServerWebServerSTS/DBCacheSTS/DBCacheDatabaseDatabaseRealtimeGameServerRealtimeGameServerPCClientPCClientSmartDeviceClientSmartDeviceClientRESTRESTRESTWebSocket
  39. 39. Database Partitioning눈팅 위주의 평범한 게시판ClientClientDatabaseDatabaseDatabaseDatabase DatabaseDatabase DatabaseDatabase쓰기복제읽기
  40. 40. Database PartitioningDatabase1Database1Database3Database3Database2Database2ClientClientDic.Dic.어디에 있니?3 번에 있어
  41. 41. Strategy & Tech게임은 [ 쓰기 ] 가 압도적으로 많다 .-아이템과 머니 때문임그냥 NoSQL 로 밀어버릴까 ?-트랜잭션은 누가 책임 ?메모리 DB 를 만들자-COM+-ADO.NET 의 DataSet-Linq-201X 년에도 이런 짓을 ?VS.
  42. 42. Memcached vs. Redis이미 질렀으니 Redis- 스펙비교는 각자 살펴보세요 .- 오직 Hash 테이블만 사용- Expires어차피 프로그램은 필요하다 .- C++ vs. C#- Hiredis vs. ServiceStack.Redis vs. BookSleeve- 직관적인 클라이언트 라이브러리 때문에 C# + BookSleeve 선택- with Linq + JSON- C# 용 클라이언트 라이브러리 직접 만들 계획
  43. 43. Database CachingWhy?- 우리들은 프로그래머니까 .- 비용절감- 도전하고 싶어서 .- 먹고 사는데 도움이 될꺼야…DatabaseDatabaseClientClientCacheServerCacheServer쓰기복제읽기
  44. 44. Caching strategy-인력세팅에 따른 사용법 고안 : 우린 DBA 가 있어요 ~작업 중에 DB 에새 쿼리가 필요하다작업 중에 DB 에새 쿼리가 필요하다DBA 에게 쿼리를요청한다DBA 에게 쿼리를요청한다DBA 에게 쿼리를받는다DBA 에게 쿼리를받는다캐시 서버에 SP 를등록한다캐시 서버에 SP 를등록한다캐시 서버에 JSON형태로 요청한다캐시 서버에 JSON형태로 요청한다캐시 서버는 자신이 갖고있으면 그대로 응답하며없으면DB 에게 질의해 돌려준다 .Write 는 캐시 갱신후DB 반영캐시 서버는 자신이 갖고있으면 그대로 응답하며없으면DB 에게 질의해 돌려준다 .Write 는 캐시 갱신후DB 반영
  45. 45. Caching sharding
  46. 46. Caching sharding성능은 맛봤으니 이제 Scale up 할 차례- 아직 Redis 는 Cluster 가 불가능 , 오직 Master/Slave 복제만 가능- ZooKeeper, Sentinel 고려- 대기표 시스템 , 정확한 실시간이 아닐 경우 , 고장감래…애당초 게임을 위한 솔루션들은 아니었다
  47. 47. Caching shardingCacheServer 1CacheServer 1CacheServer 3CacheServer 3CacheServer 2CacheServer 2CacheServernCacheServernRedis 1Redis 1Redis 3Redis 3Redis 2Redis 2RedisnRedisnGameServer 1GameServer 1GameServer 3GameServer 3GameServer 2GameServer 2GameServernGameServernProxyProxyShardingManagerShardingManagerRedis1Redis1Redis3Redis3Redis2Redis2RedisnRedisn
  48. 48. ArchitectureSwitchServerSwitchServerLobbyLobbyChatServerChatServerWebServerWebServerSTS/DBCacheSTS/DBCacheDatabaseDatabaseRealtimeGameServerRealtimeGameServerPCClientPCClientSmartDeviceClientSmartDeviceClientRESTRESTRESTWebSocket
  49. 49. REST APIASP.NET- 왜죠 ?
  50. 50. REST API- GET 서버와 POST 서버의 분리
  51. 51. FireWallFireWallREST API- 내부 / 외부 포트를 나누어 사용- ADO 대신 Cache Server 를 이용- Client 는 SSL 을 지원해야함ClientClientWebServerWebServerOtherServerOtherServerPort 443STS/CacheServerSTS/CacheServerPort XXX
  52. 52. Conclusion최근 쏟아지는 기술들중 필요한 것들만 챙기면 됩니다 .MMO 가 아니라 SNG 라면 REST 구조만 들고가도 됩니다 .어떤 서버에서 작업하든 Socket/HTTP 로 변환가능해야 합니다 .
  53. 53. Conclusion
  54. 54. 참고자료-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

×