How GameLift Realtime Server Works

javawork·2021년 10월 11일
0
post-thumbnail

원문

https://github.com/awsdocs/amazon-gamelift-developer-guide/blob/master/doc_source/realtime-howitworks.md

Amazon GameLift 리얼타임서버가 제공하는 기능, 어느 경우에 사용하면 좋은지, 리얼타임서버가 어떻게 멀티플레이 게임을 지원하는지 설명합니다.

역자주: AWS GameLift Realtime Server는 제품 이름입니다. 문서에서 "리얼타임서버"라고 언급하는 것은 실시간서버가 아니라 고유명사이니 참고 바랍니다. 이 문서를 이해하는데 가장 중요한 사항입니다. GameLift는 리얼타임서버와 커스텀서버 두가지 방식을 지원합니다.

리얼타임서버란

리얼타임서버는 멀티플레이어 게임에서 사용할 수 있도록 GameLift에서 제공하는 즉시 사용할 수 있는 경량 게임 서버입니다. 많은 게임에서 복잡한 물리 및 계산을 처리하기 위해 직접 개발한 게임 서버가 필요하지만, 이는 어떤 게임에는 꼭 필요하지 않고 오히려 과도한 작업이 될 수 있습니다. 리얼타임서버를 사용하면 직접 개발한 서버를 개발, 테스트 및 배포할 필요가 없으므로, 이 솔루션을 선택하면 게임을 완성하는 데 필요한 시간과 노력을 최소화할 수 있습니다.

주요 기능은 다음과 같습니다:

  • 게임 클라이언트/서버 상호 작용을 위한 전체 네트워크 스택. 리얼타임서버는 메시징을 위해 TCP 및 UDP 채널을 사용합니다. 이 기능을 사용하면 GameLift에서 생성한 TLS 인증서를 활성화하여 기본 제공 서버 인증 및 데이터 패킷 암호화를 사용하도록 선택할 수도 있습니다.

  • 주요 게임서버 기능. 리얼타임서버는 게임 세션을 시작(및 중지)하고, 게임 및 매치 데이터를 관리하고, 클라이언트 연결을 수락할 수 있습니다. 게임 서버는 각 클라이언트로부터 게임 상태 정보를 수신하고 게임 세션의 다른 클라이언트에 중계함으로써 동기화된 게임 세션 상태를 유지합니다.

  • GameLift 서비스와 통합. GameLift 서비스는 리얼타임서버를 트리거하여 게임 세션을 시작하고, 플레이어가 연결할 때 유효성을 검사하고, 게임 서버에서 플레이어 연결 상태 및 게임 상태를 수집합니다. 커스텀 서버에서는 구현되어야 하는 이 기능은 리얼타임서버에서는 사용자가 구현할 필요가 없습니다.

  • 커스터마이징 가능한 서버 로직. 리얼타임서버를 구성하고 게임에 가장 적합한 서버 측 게임 로직으로 사용자 정의할 수 있습니다. 또는 최소한의 구성을 제공하고 단순 릴레이 서버로 사용합니다. 리얼타임서버 커스터마이징에 대해 자세히 알아보십시오.

  • 라이브 중인 서버로직 실시간 업데이트. 리얼타임서버 설정은 언제든지 업데이트할 수 있습니다. GameLift는 업데이트된 구성 스크립트를 정기적으로 확인하므로 새 버전을 업로드하면 플릿에 빠르게 배포되고 모든 새 게임 세션에서 사용됩니다.

  • FlexMatch 매치메이킹. 리얼타임서버를 사용하는 게임 클라이언트는 대규모 매치(backfill은 아직 사용할 수 없음)를 포함하여 모든 FlexMatch 매치메이킹 기능을 사용할 수 있습니다.

  • 호스팅 리소스의 유연한 제어.리얼타임 Servers와 함께 배포된 게임의 경우 자동 크기 조정, 다중 지역 대기열, FleetIQ를 통한 게임 세션 배치, 게임 세션 로깅 및 메트릭을 비롯한 모든 GameLift 호스팅 기능을 사용할 수 있습니다. 호스팅 리소스가 활용되는 방식을 결정합니다(런타임 구성 및 기타 제어를 통해).

  • 인스턴스 리소스 옵션 제어. 리얼타임서버는 Windows와 Linux에서 실행됩니다. 플릿에 대한 컴퓨팅 리소스 유형(인스턴스 유형)과 스팟 또는 온디맨드 인스턴스를 사용할지 여부를 선택합니다.

  • AWS 안정성. 모든 GameLift와 마찬가지로 리얼타임서버를 사용한 호스팅 리소스는 AWS의 높은 수준의 품질, 보안 및 안정성을 제공합니다.

호스팅 리소스 집합을 만들고 구성 스크립트를 제공하여 리얼타임서버를 설정합니다. 리얼타임서버 시작하기 문서에 서버 생성 및 게임 클라이언트 준비 방법에 대한 자세한 설명이 있습니다.

리얼타임서버를 선택

커스텀게임 서버를 구축하는 대신 리얼타임서버를 선택하는 것은, 게임이 얼마나 복잡한 서버를 필요로 하는가에 달려 있습니다. 게임이 복잡한 게임 로직과 빠른 연산을 필요로 하지 않는다면 리얼타임서버가 더 나은 솔루션이 될 수 있습니다. 리얼타임서버가 더 적합한 게임에는 가벼운 게임이나 게임 클라이언트에서 많은 연산을 수행하여 게임을 관리하는 타입의 게임이 있습니다. 예를 들면 메시징 게임, 턴제 전략 게임 및 다양한 유형의 모바일 게임이 있습니다. FleetIQ와 함께 사용하는 리얼타임서버는 플레이어 대기 시간을 최소화하는 탁월한 도구를 제공하지만, FPS 게임이나 기타 빠른 액션 게임과 같이 네트워크 레이턴시에 대한 허용치가 매우 낮은 게임은 견고한 커스텀게임서버가 더 나을 수도 있습니다.

주요 컴포넌트

리얼타임서버에는 다음과 같은 구성요소가 있습니다. 이러한 구성 요소에 대해 자세히 알아보고 리얼타임서버가 포함된 게임 아키텍처 에서 이러한 구성 요소가 함께 작동하는 방식을 알아보세요.

  • 리얼타임서버는 게임에 대한 클라이언트/서버 네트워킹을 제공합니다. 리얼타임서버는 GameLift 서비스에 의해 게임 세션을 시작하고, 플레이어가 연결할 때 유효성 검사를 요청하고 플레이어의 연결 상태와 게임의 상태에 대해 리포트합니다. 서버는 연결된 모든 플레이어 간에 패킷을 중계하고, 사용자 지정 로직이 있으면 실행합니다.
  • 게임 클라이언트는 플레이어의 디바이스에서 실행되는 게임 소프트웨어입니다. 게임 클라이언트는 GameLift 서비스에 요청하여 참가할 게임 세션을 찾거나 새 세션을 시작하고 리얼타임서버에 연결하여 게임에 참가합니다. 서버에 연결되면 게임 클라이언트는 리얼타임서버를 통해 게임의 다른 플레이어와 패킷을 주고받을 수 있습니다.
  • 리얼타임 스크립트는 게임에 대한 설정 및 사용자 지정 게임 로직를 제공합니다. 스크립트는 아주 간단하거나 혹은 복잡한 게임 로직을 포함할 수 있습니다. 리얼타임 스크립트는 새로운 호스팅 리소스를 시작할 때 리얼타임서버와 함께 배포됩니다. 스크립트는 Node.js 기반 JavaScript로 작성됩니다.
  • GameLift 서비스는 리얼타임서버를 호스팅하는 데 필요한 컴퓨팅 리소스를 관리하고 플레이어가 게임에 연결할 수 있도록 합니다. 플레이어 수요에 대한 리소스 수를 조절하고, 활성 게임 세션에서 플레이어 슬롯을 찾아 예약하여 플레이어 참여 요청을 처리하고, 리얼타임서버가 게임 세션을 시작하도록 트리거하고, 플레이어가 게임 서버에 연결할 때 유효성을 검사합니다. 이 서비스는 리얼타임 서버 상태 및 플레이어 사용량에 대한 메트릭도 수집합니다.
  • 게임 세션은 리얼타임서버에서 실행되는 게임의 인스턴스입니다. 플레이어는 게임 세션에 연결하여 게임을 플레이하고 다른 플레이어와 통신합니다.

리얼타임서버가 게임세션을 관리

GameLift는 커스텀서버로 게임 세션을 처리하는 것과 동일한 방식을 사용하여 리얼타임서버로 게임 세션을 관리합니다. 플레이어는 게임 클라이언트를 사용하여 새 게임 세션을 생성하거나 기존 게임 세션을 검색하여 참가한다는 요청을 보냅니다. 게임 세션 배치 및 FlexMatch 매치메이킹을 포함하여 게임 세션을 생성하는 대부분의 방법은 리얼타임서버에서 사용할 수 있습니다. 게임 중 유저 보충하기(backfill)는 아직 사용할 수 없습니다.

리얼타임서버는 호스팅 인스턴스 집합에 배포되면 GameLift 서비스와의 통신을 유지합니다. 리얼타임서버는 GameLift 서비스에서 요청하면 게임 세션을 시작하고 서비스에서 매치메이킹 데이터를 포함하여 사용 가능한 게임 세션 및 플레이어 데이터를 수신합니다. 게임에서 플레이어 세션을 사용하여 게임 슬롯을 예약하거나 플레이어 연결을 인증하는 경우 리얼타임서버는 플레이어가 연결할 때 GameLift 서비스에 유효성 검사 요청을 보낼 수 있습니다. 리얼타임서버는 또한 GameLift 서비스에 상태를 다시 보고하고 플레이어가 연결/연결 해제되고 게임 세션이 종료될 때 서비스에 알립니다. 또한 GameLift의 프롬프트에 응답하여 게임 세션을 강제 종료합니다. GameLift 서비스와의 이러한 상호 작용은 리얼타임서버에 내장되어 있습니다.

게임 세션 관리를 위한 커스텀 로직을 리얼타임 스크립트에 추가할 수 있습니다. 서버별 개체에 액세스하는 코드를 작성하거나, 콜백을 사용하여 이벤트 기반 로직를 추가하거나, 타이머 혹은 상태 체크와 같은, 이벤트가 아닌 시나리오를 기반으로 로직을 추가할 수 있습니다. 예를 들어 게임 세션 개체에 액세스하거나 게임 세션이 시작 또는 종료될 때 커스텀 작업을 추가할 수 있습니다.

게임서버와 클라이언트가 통신

게임 세션이 유지되는동안, 게임 내 게임 클라이언트 간의 상호 작용은 메시지를 통해 이루어집니다. 게임 클라이언트는 메시지를 사용하여 activity, game state, game data를 교환합니다. 게임 클라이언트는 리얼타임서버에 메시지를 보내어 릴레이를 통해 게임 클라이언트 간에 메시지를 전달합니다. 게임 클라이언트는 게임 클라이언트에 통합되어야 하는 Realtime Client SDK를 사용하여 서버와 통신합니다. 클라이언트 SDK는 클라이언트가 게임에 연결하고, 메시지를 보내고 받고, 게임에서 연결을 끊을 수 있도록 하는 동기 API 호출 세트를 정의합니다. 또한 클라이언트가 특정 이벤트에 응답할 수 있도록 게임 클라이언트에서 구현할 수 있는 일련의 비동기 콜백을 정의합니다.

또한 리얼타임 스크립트에 게임 로직을 추가하여 클라이언트와 서버가 상호 작용하는 방식을 사용자가 지정할 수 있습니다. 커스텀 게임 로직을 사용하면 리얼타임서버에서 이벤트 기반 응답을 트리거하는 콜백을 구현할 수 있습니다. 예를 들어 플레이어가 특정 업적에 도달하면 서버는 다른 게임 클라이언트에 메시지를 전송하고 클라이언트는 메세지를 띄워줍니다.

통신 프로토콜

리얼타임서버와 연결된 게임 클라이언트 간의 통신은 안정적인 전달을 위한 TCP 연결과 빠른 전달을 위한 UDP 채널의 두 가지 채널을 사용합니다. 메시지를 생성할 때 게임 클라이언트는 메시지의 특성에 따라 사용할 프로토콜을 선택합니다. 메시지 전달은 기본적으로 UDP로 설정됩니다. UDP 채널이 설정되지 않았거나 사용할 수 없는 경우, 모든 메시지는 TCP를 사용하여 전송됩니다.

메세지 내용

메시지 내용은 필수로 들어가야 하는 작업 코드(opCode)와 선택적으로 넣는 페이로드의 두 가지 요소로 구성됩니다. 메시지의 opCode는 특정 플레이어 활동 또는 게임 이벤트를 식별하는 반면 페이로드는 필요에 따라 작업 코드와 관련된 추가 데이터를 제공합니다. 이 두 요소는 모두 개발자가 정의합니다. 즉, 어떤 작업이 어떤 opCode에 매핑되는지와 메시지 페이로드가 필요한지 여부를 정의합니다. 게임 클라이언트는 수신한 메시지의 opCode에 따라 메세지를 처리 합니다.

플레이어 그룹

리얼타임서버는 플레이어 그룹을 관리하는 기능을 제공합니다. 기본적으로 게임에 연결된 모든 플레이어는 "all players" 그룹에 배치됩니다. 또한 개발자는 게임에 대해 다른 그룹을 설정할 수 있으며, 플레이어는 동시에 여러 그룹의 구성원이 될 수 있습니다. 그룹 구성원은 그룹의 모든 플레이어에게 메시지를 보내거나 그룹과 게임 데이터를 공유할 수 있습니다. 그룹을 사용할 수 있는 한 가지 방법은 플레이어 팀을 설정하고 팀 커뮤니케이션을 관리하는 것입니다.

TLS 인증과 리얼타임서버

TLS 인증서 생성이 켜진 상태에서 리얼타임서버 집합을 생성하도록 선택할 수 있습니다. GameLift는 집합에 대한 TLS 인증서를 생성하고 집합의 각 인스턴스에 대한 DNS 항목을 생성합니다. 이를 통해 게임에서 클라이언트/서버 연결을 인증하고, 모든 게임 클라이언트/서버 통신을 암호화할 수 있습니다. 이 기능을 사용하면 모바일을 포함하여 향상된 보안 및 암호화된 통신이 필요한 다양한 플랫폼에서 게임을 게시할 수 있습니다. 서버 스푸핑 공격으로부터 게임 클라이언트(및 플레이어)를 보호하고 악의적인 행위자가 데이터 전송을 해킹하거나 모니터링하는 것을 방지합니다. 이러한 서비스는 AWS Certificate Manager(ACM)를 통해 제공되며 현재 추가 비용 없이 사용할 수 있습니다.

리얼타임서버를 사용하면 서버 인증 및 데이터 패킷 암호화가 이미 서비스에 내장되어 있으며 TLS 인증서 생성을 켤 때 활성화됩니다. 게임 클라이언트가 리얼타임서버와 연결을 시도하면 서버는 자동으로 TLS 인증서를 보내주고 클라이언트는 이를 검증합니다. 암호화는 TCP(Websockets) 통신용 TLS 및 UDP 트래픽용 DTLS를 사용하여 처리됩니다.

리얼타임서버를 커스터마이징

가장 기본적인 형태의 리얼타임서버는 stateless한 릴레이 서버입니다. 이러한 형태의 리얼타임서버는 게임에 연결된 게임 클라이언트 간에 메시지 패킷과 게임 데이터를 중계하지만, 메시지를 검증하거나 데이터를 처리하거나 게임 플레이 로직을 수행하지 않습니다. 이러한 방식으로 사용되는 각 게임 클라이언트는 게임 상태를 저장하는 자체 메모리를 유지하고 릴레이 서버를 통해 다른 플레이어에게 자신의 업데이트를 보내줍니다. 각 게임 클라이언트는 이러한 업데이트를 통해 자체 게임 상태를 관리할 책임이 있습니다.

다른 형태의 서버로 리얼타임 스크립트 기능을 사용하여 로직을 커스터마이징 할 수 있습니다. 리얼타임서버의 단순함을 활용하면서 기능을 사용하여 구현한 많은 서버 측 프로세스가 있습니다. 예를 들어 커스텀 게임 로직을 사용하여 서버 중심적인 stateful 한 게임을 만들 수 있습니다.

리얼타임 스크립트에 서버 측에서 구현하는 여러 콜백이 있습니다. 이러한 콜백을 구현하여 서버에 이벤트 기반 기능을 추가하십시오. 예를 들어 다음을 수행할 수 있습니다.

  • 게임 클라이언트가 서버에 연결을 시도할 때 플레이어를 인증합니다.
  • 플레이어가 그룹 참여를 요청 시 그룹에 참여할 수 있는지 확인합니다.
  • 특정 플레이어 또는 대상 플레이어에게 메시지를 전달할 수 있는지 검증하거나 이에 대한 추가 처리를 수행합니다.
  • 플레이어가 그룹을 떠나거나 서버에서 연결이 끊긴 경우 모든 플레이어에게 알리는 등의 조치를 취합니다.
  • 게임 세션 개체 또는 메시지 개체의 내용을 검증하고 데이터를 사용합니다.

리얼타임서버를 배포하고 업데이트

리얼타임서버는 GameLift의 전용 서버 리소스로 구동됩니다. 제공되는 안정성과 보안에는 차이가 없습니다. 모든 서버와 마찬가지로 GameLift의 매치메이킹 및 Fleet IQ 대기열을 사용하여 대기 시간을 최소화할 수 있습니다. 이 대기열은 플레이어 위치에 따라 게임 세션 배치를 최적화합니다.

GameLift를 사용하여 리얼타임서버 게임을 배포할 때 프로세스는 GameLift에 기존 게임 서버를 배포하는 것과 거의 동일합니다. 컴퓨팅 리소스 집합을 생성하고 설정 세부정보 및 커스텀 로직이 포함된 리얼타임 스크립트를 배포합니다. GameLift를 사용하여 사용할 플릿 유형을 선택하고, 플릿 용량을 관리하고, 게임 서버 프로세스가 시작되고 플릿에서 실행되는 방법을 제어합니다. 리얼타임서버 혹은 커스텀서버를 사용한 게임 호스팅에 대한 자세한 설명은 How Amazon GameLift Works 문서에 있습니다.

리얼타임서버의 주요 이점은 언제든지 스크립트를 업데이트할 수 있다는 것입니다. 업데이트된 스크립트를 배포하기 위해 새 플릿을 생성할 필요가 없습니다. 스크립트를 업데이트하면 몇 분 내에 새 버전이 모든 호스팅 리소스에 전파됩니다. 새 스크립트가 배포되면 기존 게임 세션은 구버전으로 유지되고, 해당 시점 이후에 생성된 모든 새 게임 세션은 새 스크립트 버전을 사용합니다.

profile
게임 개발자

0개의 댓글