면책 조항 : 내 게임 프로그래밍 경험은 클라이언트 측 싱글 플레이어 게임을 기반으로하지만 웹 응용 프로그램 (특히 Microsoft 스택)에 대한 배경 지식이 있으므로이 답변에서 오는 부분이 많이 있습니다. 실제 게임 서버를 실제로 테스트하지 않으면 적용 방법을 말하기가 어렵지만 여기에 적용됩니다. 나는 이것을 알고 있습니다 : 나는 게임 서버를 배포하지 않았으며 웹 응용 프로그램 만 배포했습니다.
두 가지 (서버) 계층 접근 방식을 제안합니다. 데이터베이스 계층 및 "애플리케이션"계층 세 번째 (프레젠테이션) 티어가 게임 클라이언트입니다.
관계형 데이터베이스는 데이터를 쿼리하고 데이터를 작성하는 데 적합합니다. 핵심은 데이터베이스 쓰기를 클러스터가 처리 할 수있는 관리 가능한 크기 청크로 직렬화하는 것입니다. SQL Server의 고급 버전 (데이터 센터 / 엔터프라이즈)은 클러스터링 및 복제를 지원합니다. 작은 클러스터를 구축하고 클러스터에 대한 쿼리를 실행하여 작동 방식을 확인하는 것으로 시작합니다.
응용 프로그램 계층에서 "영역 지정"또는 이와 유사한 작업을 수행하는 경우 클러스터를 설정하지 않고 벗어날 수 있으며 영역 당 서버를 간단히 설정할 수 있습니다. 영역이 커지면 각 영역에 대한 클러스터를 설정할 수 있습니다.
응용 프로그램 계층-> 데이터베이스 계층에서 데이터를 전송하기위한 직렬화 프로세스를 구축하려고합니다. 핵심은 여러 수준의 직렬화가 진행되는 것입니다. 뭔가 같은 이 :
- 레벨 1 : X 초마다 DB에 저장, 중요한 데이터 포함 :
- 레벨 2 : 2X 초마다 DB에 저장, 중간 데이터 포함 :
- 3 단계 : 가능한 한 드물게 다른 모든 것
이렇게하면 게임의 특성에 따라 쓰기가 일관되고 예측 가능하게 유지되므로 데이터베이스 쓰기가 드물게 발생할 수 있습니다. 핵심은 응용 프로그램 서버가 충돌 한 경우 데이터베이스의 상태에서 온라인 상태로 돌아와야하므로 90 분마다 플레이어 인벤토리를 직렬화하면 플레이어가 화를 낼 수 있다는 점을 알아야합니다.
데이터를 읽으려면 가능한 한 응용 프로그램 계층의 메모리에 최대한 많이로드 한 다음 모든 코드가이 메모리 풀을 사용하는지 확인하십시오. 백그라운드에서 메모리 풀을 데이터베이스와 동기화 할 수 있습니다. Joe가 지적한 것처럼 "실시간"트랜잭션이 필요할 때가 있습니다. 대부분의 쓰기를 직렬화하면 데이터베이스 서버 / 클러스터에 충분한 하드웨어가 있다고 가정하고 필요할 때 실시간 트랜잭션을 수행 할 수있는 충분한 IO가 데이터베이스에 있어야합니다.