다음을 통해 공유


서버리스 비동기 멀티 플레이어 참조 아키텍처

아키텍처 다이어그램

A비동기 멀티 플레이어 참조 다이어그램

아키텍처 서비스

  • Azure 함수 - 소규모 매치 메이킹 논리를 실행하는 데 사용됩니다. 소비 계획을 사용하는 경우 함수 정의가 파일 저장소에 저장되므로 스토리지 계정을 만들어야 합니다. 최적의 성능을 위해서는 함수와 동일한 지역에서 스토리지 계정을 사용해야 합니다.
  • Azure Database for MySQL - 정보를 빠르고, 안정적 이며, 비용 효율적으로 저장하는 데 사용됩니다.
  • 알림 허브 - 사용하기 쉽고 확장 가능한 푸시 엔진으로 다양한 플랫폼(iOS, Android, Windows, Kindle, Baidu 등)에 알림을 보낼 수 있습니다.
  • SignalR - 사용자가 연결된 디바이스 클라이언트로 데이터를 푸시할 수 있도록 HTTP를 통해 애플리케이션에 실시간 웹 기능을 추가하는 프로세스를 간소화합니다.
  • Key Vault - 데이터베이스 연결 문자열을 포함하여 암호를 관리하는 가장 좋은 서비스입니다.

디자인 고려 사항

이 참조 아키텍처에서는 간단한 서버리스 틱택토(tic-tac-toe) 게임을 소개합니다.

이 참조 아키텍처에서는 도우미 클래스(데이터 클라이언트)가 데이터베이스에 연결하여 상호 작용하며, 나머지 함수는 필요할 때 사용됩니다. 게임 세션 클래스는 플레이어가 전송하는 정보를 사용하여 턴을 실행하고 승자를 계산하는 데 사용됩니다. 지원되는 동작 이벤트는 forfeit(게임 포기), addPlayer(게임 세션에 플레이어 추가), takeTurn 등 3가지가 있습니다.

배포 템플릿

Azure 서비스에 대한 명명 규칙 및 제한 사항을 요약하는 섹션이 포함된 일반 지침 문서를 참조하세요.

참고

ARM 템플릿이 작동하는 방식에 관심이 있는 경우 이 참조 아키텍처에 활용된 각 서비스에서 Azure Resource Manager 템플릿 설명서를 참조하세요.

경고

데이터베이스 관리자 암호는 8~128문자를 포함해야 합니다. 또한 다음 중 세 범주의 문자가 포함되어야 합니다. 영어 대문자, 영어 소문자, 숫자(0~9) 및 영숫자가 아닌 문자(!, $, #,% 등).

Azure Functions를 로컬로 실행하려면 다음과 동일한 앱 설정을 사용하여 local.settings.json 파일을 업데이트합니다.

단계별 설명

새 게임 세션 만들기

  1. 디바이스 클라이언트는 플레이어가 선택한 모든 게임 설정을 형식 지정하고 게임 세션 시작 이벤트를 백엔드로 전송한 다음 응답을 기다립니다.
  2. 백엔드는 새 게임 세션을 시작하라는 명령을 수신합니다. 먼저 플레이어 설정과 일치하는 기존 게임 세션을 찾으려고 시도합니다.
  3. 매치 메이킹에 적합한 게임 세션을 사용할 수 없다고 판단하면 새 게임 세션 개체가 만들어집니다.
  4. 새로운 지속성 Orchestrator 함수가 만들어집니다.
  5. 지속성 Orchestrator 함수는 게임 세션 개체를 읽고 최소 2명의 플레이어가 게임 세션에 참가할 때까지 기다립니다.
  6. 첫 번째 플레이어가 선택한 것과 동일한 설정이 있는 다른 플레이어가 게임 세션 시작이벤트를 백엔드로 보냅니다.
  7. 백엔드는 이 명령을 수신하고 기존 게임을 찾으려고 시도합니다. 이 경우 이전에 만든 게임 세션을 검색합니다.
  8. 지속성 Orchestrator 함수는 addPlayer 이벤트를 수신하고 2명의 플레이어가 게임 세션에 참가하면서 대기를 중지합니다.
  9. 지속성 Orchestrator 함수는 공식적으로 일치를 시작하고, 게임 상태 진행 중으로 설정하 고, 시작할 플레이어 하나를 임의로 선택합니다. 간단히 말해서 Orchestrator는 게임 논리를 실행하고 게임 상태를 업데이트하는 역할을 담당합니다.
  10. 지속성 Orchestrator 함수는 데이터를 데이터베이스에 유지하기 위해 작업을 트리거합니다. 데이터 클라이언트 도우미 클래스를 활용하여 데이터를 유지할 데이터베이스에 연결합니다.
  11. 지속성 Orchestrator 함수는 게임 세션 논리를 실행하고 다음 플레이어의 턴을 반환합니다.
  12. 게임 상태(다른 플레이어의 턴, 누군가가 승리, 누군가가 몰수됨 등)에 따라 플레이어에 대한 알림을 큐로 보냅니다.
  13. 그런 다음 지속성 Orchestrator는 새로운 게임 상태로 자신을 호출하고 다음 이벤트를 수신할 때까지 기다립니다.
  14. 디바이스 클라이언트는 게임 세션을 관리하는 Orchestrator 함수의 고유 식별자를 포함하여 알림을 받습니다.
  15. 디바이스 클라이언트는 알림에서 받은 지속성 Orchestrator의 고유 식별자를 포함하여 게임 세션 로드 이벤트를 백엔드로 전송합니다.
  16. 백엔드는 게임 세션 로드 명령을 수신하고 디바이스 클라이언트가 표시할 게임 세션 세부 정보를 반환합니다.
  17. 플레이어는 지속성 Orchestrator 함수에 직접 X 또는 O를 제출하고 턴을 종료합니다.

플레이어 게임 목록 요청

  1. 디바이스 클라이언트는 세션 목록 가져오기 명령을 백엔드에 제출합니다.
  2. 백엔드는 데이터베이스를 쿼리하여 요청을 처리한 다음 데이터를 디바이스 클라이언트에 보냅니다. 쿼리에서 반환하는 결과의 개수를 제한하고 순서를 지정하는 것을 고려합니다.
  3. 디바이스 클라이언트는 백엔드 응답을 수신하고 여기에 포함된 데이터로 관련 UI를 채웁니다.

구현 샘플

독자를 위한 연습

제공된 샘플에는 데이터베이스에서 읽기를 크기 조정하는 논리가 포함되어 있지 않으며 쓰기만 가능합니다. 데이터베이스 연결이 소진되지 않도록 데이터베이스 앞에 캐시를 배치하거나 데이터베이스를 확장하는 것을 고려합니다.

보안 고려 사항

데이터베이스 연결 문자열을 함수의 원본에 하드 코딩하지 마세요. 대신, 적어도 함수 앱 설정을 활용하거나 더 강력한 보안을 위해 Key Vault를 사용하세요. Key Vault를 만드는 방법, 함수에 관리되는 서비스 ID를 사용하는 방법, 마지막으로 함수에서 Key Vault에 저장된 암호를 읽는 방법을 설명하는 자습서가 있습니다.

대안

이 참조 아키텍처에서는 Azure Database for MySQL이 사용되었지만 Azure SQL Database 또는 Azure Database for PostgreSQL로 바꿀 수도 있습니다.

추가 리소스 및 샘플

지속성 함수 및 Azure SignalR Service를 사용한 퀴즈 게임

T지속성 함수 및 Azure SignalR Service를 사용한 퀴즈 게임

완전 비동기는 아니지만(20초 타이머로 실행됨) 이 링크에서 지속성 함수 및 Azure SignalR Service를 기반으로 빌드된 퀴즈 게임의 구현을 찾을 수 있습니다. 힌트는 jservice.io에서 검색됩니다. 실행되는 모습을 보려면 이 링크를 참조하세요.

작동 방식:

  1. 퀴즈 게임 호스터가 배포 시 또는 웹 요청을 통해 HttpStartSingle Azure 함수를 호출하여 게임을 시작합니다.
  2. 해당 Azure 함수가 TriviaOrchestrator 지속성 Azure 함수를 시작합니다.
  3. 플레이어가 게임에 참가합니다. 앱을 실행하는 각 플레이어의 디바이스 클라이언트는 백엔드에서 Azure SignalR Service 허브 세부 정보를 검색합니다. 백엔드는 SignalRInfo Azure 함수를 통해 요청을 수신합니다. 함수 바인딩이 연결 문자열의 키를 사용하여 토큰을 생성하고 이를 디바이스 클라이언트로 전송합니다. 디바이스 클라이언트는 Azure SignalR Service로부터 newCluenewGuess를 수신 대기할 두 이벤트를 설정합니다.
  4. 백엔드에서 TriviaOrchestrator 지속성 Azure 함수GetAndSendClue 지속성 작업 Azure 함수를 호출합니다.
  5. TriviaOrchestrator 지속성 Azure 함수는 20초마다 자신을 호출하도록 타이머를 설정합니다. 이 시간은 플레이어가 퀴즈 힌트에 응답하는 데 걸리는 시간입니다.
  6. GetAndSendClue 지속성 활동 Azure 함수는 jservice.io 서비스에서 퀴즈 힌트를 가져옵니다.
  7. 그런 다음 퀴즈 힌트가 대상 newClue를 사용하여 모든 연결된 사용자에게 Azure SignalR Service를 통해 브로드캐스트됩니다.
  8. 플레이어는 Azure SignalR Service에서 퀴즈 힌트를 받아 답을 제출합니다.
  9. 백엔드는 SubmitGuess Azure 함수를 통해 플레이어 응답을 수신합니다.
  10. 이 Azure 함수는 플레이어가 제출한 답이 정답인지 계산합니다. 그런 다음 결과가 newGuess를 사용하여 모든 연결된 사용자에게 Azure SignalR Service를 통해 브로드캐스트됩니다.
  11. 디바이스 클라이언트는 Azure SignalR Service에서 응답을 수신하고 정답 또는 오답 수를 업데이트합니다.

가격

Azure 구독이 없는 경우 무료 계정을 만들어 12개월 무료 서비스를 시작합니다. 이러한 서비스의 제한을 초과하지 않는 한 Azure 무료 계정에서 무료로 제공하는 서비스에 대해서는 요금이 부과되지 않습니다. Azure Portal을 통해 또는 사용량 파일을 통해 사용량을 확인하는 방법을 알아보세요.

이러한 참조 아키텍처를 실행하는 동안 사용되는 Azure 서비스의 비용은 사용자가 부담합니다. 전체 금액은 사용량에 따라 달라집니다. 참조 아키텍처에 사용된 각 서비스에 대한 가격 웹 페이지를 참조하세요.

Azure 가격 계산기를 사용하여 사용하려는 Azure 서비스에 대한 비용을 구성하고 예측할 수도 있습니다.