실시간 게임을위한 최고의 서버 아키텍처는 무엇입니까?


10

수천 명의 플레이어를 실시간으로 유지해야하는 Real-Time 게임을 개발 중입니다 (FPS와 같은 최대 1 초 지연). 이를위한 최고의 인프라는 무엇입니까?

내 생각은 2 개의 서버 클러스터를 사용하는 것이 었습니다. 하나는 서버 쪽 (모든 컴퓨팅 쪽)과 다른 하나는 데이터베이스 쪽입니다. 여기서로드 밸런서는 각 클러스터에 대해 "책임"이 있습니다. 하나의 기본 서버는 사용자로부터 요청을 수신하고 사용자가이 작업을 수행 할 수있는 관련 서버의 IP 주소를 다시 보냅니다.

데이터베이스 클러스터는 데이터베이스 간 일관성을 위해 데이터베이스 복제를 사용합니다.

지리적 부하 분산 장치도 있어야합니다. 따라서 최상의 응답을 위해 각 사용자에게 지역 부하 분산 장치를 할당합니다.

게임에 .NET + MSSQL을 사용하고 있습니다.

감사!


2
"인프라"라고 말하면 소프트웨어, 하드웨어, 서비스를 의미합니까, 아니면 기존 계획을 그대로 비판하고 싶습니까?
Tetrad

1
@Nate-복제하지 않고 확장 할 계획이므로 완전히 확장 가능해야합니다.
로마

2
-1 때문에 teddziuba.com/2008/04/im-going-to-scale-my-foot-up-y.html- 용량 요구 사항을 다루지 않습니다. 게임이 파편화되지 않았지만 존으로 구분되어 있습니다 확장 성 등 성능 최적화의 특성에는 특정 정보가 필요하며 최고의 아키텍처는 없습니다.

1
나는 당신의 질문을 좀 더 구체적으로 바꾸겠습니다. 사실적이고 비 주관적인 방법으로 '최고'는 무엇입니까? 확장, 관리, 관리가 가장 쉽고, 가장 빠르거나 무엇을 의미합니까?
공산주의 오리

1
"가장 쉬운"도 주관적입니다. 어떤 리소스를 통해 어떤 기간 동안 누구에게 가장 쉬운가요? Stack Exchange는 특정 질문과 함께 가장 잘 작동합니다. "LINQ와 MSSQL을 사용하여이 서버를 구축했지만 초당 70 번의 트랜잭션 후에 떨어졌습니다. 여기에서 런타임의 73 %를 차지하는 상위 2 개의 트랜잭션이 있습니다. 처리량을 어떻게 증가시켜야합니까? "

답변:


6

예를 들어, 요구 사항에 대해 더 많이 알지 못하면 최상의 아키텍처가 없습니다. 캐릭터 간 상호 작용의 종류, 지속될 데이터의 양 등.

1 초의 대기 시간에 대처할 수 있다면 문제없이 단일 서버에서 1000 명의 플레이어를 호스팅 할 수 있지만 실제로는 대기 시간이 훨씬 짧은 FPS 개념과 충돌합니다. 100ms 미만 그러나 높은 대기 시간을 처리 할 수있는 시스템은 메시지 전달을 통해 모든 작업을 수행 할 수 있으므로 일관성이 매우 간단합니다. 논리를 제공하는 것은 매우 간단합니다. 즉, 논리 오브젝트를 잠긴 오브젝트 시스템이 아닌 메시지 기반 시스템으로 전환하면 복잡한 논리가 더욱 악화되지만 모두 애플리케이션의 요구에 달려 있습니다.

마찬가지로 많은 데이터를 유지하지 않으면 데이터베이스 시스템이 전혀 필요하지 않지만 알지 못하면 말하기가 어렵습니다. 소량의 데이터를 유지하고 토너먼트 또는 다른 일이 끝날 때만 데이터를 수행하는 경우 별도의 데이터베이스가 필요하지 않습니다. 반면에 많이 유지하지 않고 많이 읽는 경우 복제 된 데이터베이스가 도움이 될 수 있습니다. 그러나 관계형 데이터베이스가 문제의 첫 번째 문제와 가장 일치하지 않을 수도 있습니다. 종종 인 메모리 캐시가 더 나은 솔루션입니다. 마찬가지로 캐릭터간에 트랜잭션 스타일 상호 작용이 없으면 일관성이 덜 중요해집니다. (그리고 그러한 거래가 거의 없다면 특별한 경우가 될 수 있습니다.)

실제로 RDBMS가 대규모 시스템에서 수행 되었기 때문에 RDBMS를 채택하는 것에주의하십시오. 개인적으로 온라인 게임에서 사용하는 것을 승인하지만 선호하는 데이터베이스를 가져 와서 캐시 및 복제로 조정하는 대신 요구 사항을 살펴보고 지속성 전략을 파악하는 것이 가장 좋습니다. 앱. 오프라인보고 기능 만 있으면됩니다.이 경우 게임 지속성 메커니즘에서 원격 RDBMS로 백그라운드 프로세스 로깅을 수행하는 것이 가장 좋습니다.


4

면책 조항 : 내 게임 프로그래밍 경험은 클라이언트 측 싱글 플레이어 게임을 기반으로하지만 웹 응용 프로그램 (특히 Microsoft 스택)에 대한 배경 지식이 있으므로이 답변에서 오는 부분이 많이 있습니다. 실제 게임 서버를 실제로 테스트하지 않으면 적용 방법을 말하기가 어렵지만 여기에 적용됩니다. 나는 이것을 알고 있습니다 : 나는 게임 서버를 배포하지 않았으며 웹 응용 프로그램 만 배포했습니다.

두 가지 (서버) 계층 접근 방식을 제안합니다. 데이터베이스 계층 및 "애플리케이션"계층 세 번째 (프레젠테이션) 티어가 게임 클라이언트입니다.

관계형 데이터베이스는 데이터를 쿼리하고 데이터를 작성하는 데 적합합니다. 핵심은 데이터베이스 쓰기를 클러스터가 처리 할 수있는 관리 가능한 크기 청크로 직렬화하는 것입니다. SQL Server의 고급 버전 (데이터 센터 / 엔터프라이즈)은 클러스터링 및 복제를 지원합니다. 작은 클러스터를 구축하고 클러스터에 대한 쿼리를 실행하여 작동 방식을 확인하는 것으로 시작합니다.

응용 프로그램 계층에서 "영역 지정"또는 이와 유사한 작업을 수행하는 경우 클러스터를 설정하지 않고 벗어날 수 있으며 영역 당 서버를 간단히 설정할 수 있습니다. 영역이 커지면 각 영역에 대한 클러스터를 설정할 수 있습니다.

응용 프로그램 계층-> 데이터베이스 계층에서 데이터를 전송하기위한 직렬화 프로세스를 구축하려고합니다. 핵심은 여러 수준의 직렬화가 진행되는 것입니다. 뭔가 같은 이 :

  • 레벨 1 : X 초마다 DB에 저장, 중요한 데이터 포함 :
    • 선수 건강
    • 선수 아이템 / 픽업
  • 레벨 2 : 2X 초마다 DB에 저장, 중간 데이터 포함 :
    • 선수 위치
    • NPC 위치
  • 3 단계 : 가능한 한 드물게 다른 모든 것

이렇게하면 게임의 특성에 따라 쓰기가 일관되고 예측 가능하게 유지되므로 데이터베이스 쓰기가 드물게 발생할 수 있습니다. 핵심은 응용 프로그램 서버가 충돌 한 경우 데이터베이스의 상태에서 온라인 상태로 돌아와야하므로 90 분마다 플레이어 인벤토리를 직렬화하면 플레이어가 화를 낼 수 있다는 점을 알아야합니다.

데이터를 읽으려면 가능한 한 응용 프로그램 계층의 메모리에 최대한 많이로드 한 다음 모든 코드가이 메모리 풀을 사용하는지 확인하십시오. 백그라운드에서 메모리 풀을 데이터베이스와 동기화 할 수 있습니다. Joe가 지적한 것처럼 "실시간"트랜잭션이 필요할 때가 있습니다. 대부분의 쓰기를 직렬화하면 데이터베이스 서버 / 클러스터에 충분한 하드웨어가 있다고 가정하고 필요할 때 실시간 트랜잭션을 수행 할 수있는 충분한 IO가 데이터베이스에 있어야합니다.


ACID를 방금 던져서 데이터베이스를 빅 데이터 저장소로 사용하고 있기 때문에 -1입니다. 괜찮습니다 .Windows 디스크 스케줄러는 여전히 성능이 향상 될 정도로 크래프이며 데이터를 사용하여 깔끔한 오프라인 메트릭을 수행 할 수는 있지만 여전히 게임 자체의 트랜잭션을 뒷받침하는 ACID, 즉 데이터베이스가 필요합니다. 실시간으로.

드문 드문 동안, 그것은 마지막 단락에서하려고했던 것입니다. 가능한 경우 IN-Memory를 사용하는 곳과 필요할 때 데이터베이스를 사용하는 약간의 하이브리드를 권장합니다.
Nate

문제는 메모리의 내용, 다른 전체 데이터베이스에 대해 생각하고 실제로 까다로운 비트 인 구현 방법에 대한 지침을 제공하지 않았다는 것입니다.

사실은 세부적인 구현이 아니라 큰 그림 아키텍처에 관한 문제였습니다.
네이트

사실이지만 중간 계층 전체를 제외했습니다. 지연 시간이 짧은 RDB입니까? ODB? 키 / 값 저장소? DB가없고 ACID를 포기 하시겠습니까? STM 또는 잠금? 공정하게 말하면 질문에 정보가 많지 않기 때문에 아키텍처 다이어그램에 대한이 모든 대답은 중간에 "?" 거기에 두 개의 서비스를 더 연결하십시오. 실제로 "?" 입니다.
당사 사이트를 사용함과 동시에 당사의 쿠키 정책개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.