티스토리 뷰
2022/11/24 AWSKRUG 아키텍처 모임에서 발표한 게임 서버 아키텍처 관련 정리 세미나 자료를 올려봅니다.
- 주로 웹 비지니스 애플리케이션 관련한 이야기 뿐이라 게임쪽에도 관심을 갖으면 좋을 것 같아 정리해서 발표해보았습니다.
관련 질의 응답
Q. 실시간성이 필요한 대전게임 LOL이나 스타크래프트 같은 게임은 실시간 소켓을 어떻게 만드나요..??
A. 전송 속도 때문에 보통 UDP를 사용합니다. 짧은 시간 동안 들어온 모든 입력 이벤트를 묶어서 전송(크면 나눠서 전송)합니다.
Q. 퀘스트를 깻을 때에 서버로 데이터를 보내는데, 이에 대한 악의적인 manipulating의 검증은 어떻게 하나요..?!
A. 기본적으로 클라이언트와 서버 간의 고유한 키를 이용해 암호화를 하고, 서버에서 내용 검증합니다. 클라이언트는 언제든지 해킹될 수 있기 때문에 암호화된 내용 조차 변조될 수 있습니다. 그래서 플레이어 경험에 영향을 미칠 수 있는 모든 검증은 서버에서 진행합니다.
Q. 일반 비즈니스 애플리케이션 서비스의 부하 분산 전략과 다르게 게임 아키텍처에서 특별히 자주 사용되는 부하 분산을 위한 전략 같은 게 있을까요?
A. 크게 다르지 않다고 생각합니다. 게임의 기술적인 특징에 따라 로드 밸런싱도 사용할 수도 있고, 그렇지 않은 경우 게임 서버 매트릭에 따라 스케일링이 가능한 GameLift 등의 게임 전용 플랫폼을 사용할 수도 있습니다. 내부 호출의 부하 분산을 위해 메시지 큐나 서비스 메쉬 등을 사용하기도 하며, 보통은 최대 플레이어가 제한된 채널(게임 서버)를 플레이어가 선택하도록 하고, 스케일링 중에는 게임 접속을 대기하도록 접속 대기열 방식도 사용합니다.
Q. 한번에 여러 플레이어의 요청을 동시에 처리/전송해야 하는 게임 같은 경우, 플레이어간 sync를 맞추기 위해 아키텍처에서 어떤 부분을 신경 써서 구성할 수 있을까요?
A. 네트워크 지연 최소화, 유무선 네트워크 환경에 대한 고려를 신경 써야 하겠습니다만, 무엇보다 sync에 필요한 전송량, 회수를 최소화해야 합니다. 서버에서 모든 것을 처리하기 보다는 플레이어 경험을 해치지 않을 수 있는 일부 처리는 클라이언트에 위임하는 것도 고려해 볼 수 있겠습니다.
Q. 리플레이를 위해 스타크래프트 또는 LOL에서는 실시간 스트리밍 영상를 저장하는 기능을 제공하는데, 이 부분은 어떠한 아키를 구성해서 기능화하나요?
A. 게임 진행 중에 발생한 플레이어의 키 입력 등의 입력과 게임에 필요한 메타 정보를 함께 묶어 시간 정보와 함께 저장하고, 그 정보를 바탕으로 재생합니다(이른바 옵저버 모드). 그래서 리플레이 파일이 매우 작은 것을 확인해 볼 수 있습니다.
Q. stateful한 실시간 멀티 플레이 게임(dedicated server가 아닌) 어떻게 무중단 배포를 구현할 수 있을까요?
A. 이전 배포 버전과 호환성이 있는 마이너한 변경 버전의 배포의 경우 서버 별로 배포하는 롤링 업데이트를 고려해 볼 수 있을 것 같습니다. 해당 서버가 종료될 때에, 클라이언트에서 재 접속하도록 유도(혹은 자동으로 진행)하는 방식입니다. 플레이어가 이런 부분을 게임에서 자연스러운 규칙으로 받아 드릴 수 있도록(혜택을 준다거나…) 기획으로 풀어가는 것도 필요하겠습니다.
Q. 모바일 게임 플레이어가 많이 좋은 아이템을 하기 위해서 계속 새롭게 등록하여 게임 데이터베이스가 터진다는 이야기가 있습니다. 이런 것을 막을 방법이 없을까요?
A. 막기 보다는 허용해야 한다고 생각합니다. 사실 그런 애증의 플레이어들도 감사할 따름입니다. 행복한 고민이라 봅니다. 다만 너무 양이 많아질 경우를 대비해서, 계정 유효 기간 등의 정리 정책이 필요합니다. 또 해당 트래픽이 해킹툴, 봇을 이용한 경우인지, 작업장인지를 분별하고, 이런 조심스럽게 정리해 갈 수 있도록 서버에서 데이터 검증은 기본이고, 안티 치트 솔루션(행동 분석을 통한 비정상적인 동작 감지 포함) 등의 도입이 필요할 수 있겠습니다.
Q. 패킷 교환이 많은 게임서버에서는 어떤 모니터링 툴을 주로 사용해서 장애파악/성능지표 확인을 할수 있을까요?
A. 그라파나나 데이터독도 쓰지만, 모니터링 툴의 문제라기 보다는 어떤 매트릭을 수집하고 관찰할 것인가? 하는 더 중요합니다. 로드 테스트 등을 통해 필요 매트릭을 찾아보는 것을 추천드립니다.
Q. api라면 데이터독같은것을 많이 사용하는것같던데 소켓 서버는 어떤 방식으로 모니터링 할수 있을지 궁금합니다.
A. 로그를 기록하거나, 매트릭 모니터링 도구에서 제공하는 코드를 소켓 서버에 임베딩하여 원하는 매트릭을 기록할 수 있습니다. GameLift에서도 그런 기능을 제공합니다.
댓글