게임 서버 프로그래밍 입문 (10) - 게임 서버 구조
지금까지 게임 서버를 만들기 위한 코드를 작성해 왔습니다.
지금 완성된 모듈로도 어느 정도 게임 서버 구실이 나올 수 있을 겁니다.
그럼 실제 게임 서버는 어떤 구조로 되어 있을까요?
간략하게 로그인에 처리 및 서버 부팅 단계를 그려 보았습니다.
개인적으로 경험한 회사는 별로 없지만, 대부분의 게임 서버는 위와 같은 구조로 돌아갑니다.
처음 서버가 뜨면, 정해진 ip/port를 받아서 통신할 준비를 하며, 다른 서버군 (모니터닝 서버나, 아이템 샵 서버, 게임 월드 서버 등……)에게 자신이 실행 중이라는 사실을 알립니다.
당연히 DB 처리가 있으면, DB 연결도 해야 하겠네요,
게임 서버라면 게임 데이터를 읽어서 각각의 실행 객체를 생성하는 작업을 진행합니다.
이후, IOCP 에코 서버와 같이, 클라이언트 접속을 기다려서, 클라이언트가 붙으면 세션을 만들고, 패킷을 분석해서 적절한 처리를 해줍니다.
이제 위의 엑티비티 다이어그램을 참고로 지금까지 작성한 라이브러리를 사용해서 진짜 게임 서버 프로그램을 만들어 봅시다. 테스트로 서버프로그램 2개만 생성해 봅시다.
하나는 LoginServer이고, 다른 하나는 DB와 연결을 직접 하는 DBAgent 입니다.
DB처리 서버를 분리 하느냐고요?
최근 추세는 DB와 연결하는 서버를 따로 두어서 DB에 데이터를 받거나 읽는 처리는 DBAgent라는 서버로 분리하는 추세입니다.
이렇게 분리하면 아래와 같은 이점이 있습니다.
1. 게임 로직과 DB 처리 로직을 분리 할 수 있습니다.
2. DB라는 것이 물리적으로 다른 서버에 구축되어 있으므로 게임 로직상 DB를 거치게 되면 DB의 응답이 올 때까지 로직이 멈추게 구현할 수 있습니다.
물론 체감이 느껴지진 않지만 이로 인해 서버 공격 (DB 처리가 많이 드는 행동을 집단으로 한다던가)가 발생 할 수 있습니다. 만약 분리를 한다면, DB 데이터 요청도 일종의 서버 패킷처리와 같이할 수 있으므로 로직 작성 시 위와 같은 비 동기화 처리가 자연히 고려되어 작성하게 됩니다.
3. DB처리만으로 보면 아주 간단한 처리이므로 만들어놓고 문제가 생기지 않는 이상 건드릴 필요 없습니다. 즉 관리 이슈가 많이 줄어듭니다.
이를 바탕으로 만들려고 하는 간이 서버 구조는 아래와 같습니다.
위 내용은 제가 집필한 "게임 서버 프로그래밍 입문" 책의 내용중 일부 부분에 대한 내용입니다.
전체 소스 코드와 책 구입에 대해서는 http://rosagigantea.tistory.com/589 에 링크 시켰습니다