아키텍처 개요 #

Nakama는 여러 하위 시스템에서 실시간 및 비실시간 API를 노출하는 모놀리식 상태 저장 서버입니다. Nakama의 하위 시스템은 아래에서 설명하는 주요 하위 시스템과 함께 다양한 작업을 처리합니다.

권한 부여 #

Nakama의 권한 부여 시스템은 사용자 인증, 세션 상태권한 부여를 처리합니다. 이 시스템은 사용자를 관련 데이터에 안전하게 연결합니다. 이 시스템은:

  • 서명된 JSON 웹 토큰(JWT)으로 신뢰할 수 있는 클라이언트 연결 설정
  • 사용자 계정을 소셜 로그인에 연결
  • 에지 캐싱을 위한 사용자 지정 데이터 속성 포함

클러스터 관리 #

Nakama의 클러스터 관리 시스템은 충돌 없는 복제 데이터 유형과 가십 기반 P2P 연결을 통해 기본 제공 서비스 검색을 제공합니다.

이 시스템을 통해 Nakama 클러스터는 개별 노드의 손실에 적절하게 대응하거나 트래픽 급증을 처리하기 위해 온라인 상태가 된 새 노드로 부하를 분산할 수 있습니다. 이 시스템은 변경된 클러스터 토폴로지에 반응하고 각 노드에 대한 클라이언트 연결 변경 사항을 기록하여 유연하고 효율적인 확장을 지원합니다.

콘솔 및 메트릭스 #

Nakama의 내장 콘솔 및 메트릭스 시스템에는 DevOps 전문가용 필수 도구가 있습니다. 이 콘솔의 독립형 인터페이스를 통해 노드의 상태와 데이터를 검사할 수 있으며 메트릭스는 Prometheus를 통해 팀이 선호하는 외부 모니터링 및 분석 도구로 데이터를 내보냅니다.

데이터베이스 #

Nakama의 데이터베이스 시스템은 장기적인 지속성을 관리합니다. Nakama의 메모리 내 시스템의 경우 다양한 데이터에 대한 빠른 읽기 및 쓰기 액세스가 가능하지만 Nakama의 데이터베이스 구성요소는 체계적인 북키퍼(bookkeeper)로서 수명이 긴 데이터를 효율적이고 안정적으로 저장합니다.

지속성과 관련하여 Nakama는 PostgreSQL 유선 호환 데이터베이스를 지원하는 다양한 배포 시나리오에 사용할 수 있습니다. 표준 구성에서 Nakama는 확장 가능하고 지리적으로 분산되어 있으며 내구성이 뛰어난 데이터 저장소를 위해 CockroachDB와 함께 실행됩니다.

외부 인터페이스 #

Nakama의 외부 인터페이스 시스템의 경우 소켓 및 요청 인터페이스가 노출됩니다. Nakama로 제작된 게임은 두 인터페이스를 모두 사용할 수 있지만 게임 디자인 및 게임 경험에 관한 기타 세부 사항에 따라 둘 중 하나만 필요할 수도 있습니다.

소켓 인터페이스는 채팅실시간 멀티플레이어와 같은 실시간 활동을 위한 기본 시작 위치입니다. 이 소켓 인터페이스는 바이너리(프로토콜 버퍼) 또는 텍스트(JSON) 페이로드를 선택하여 WebSocket 및 rUDP에서 실행됩니다.

gRPC 및 HTTP에서 실행되는 요청 인터페이스는 사용자 계정 관리와 같은 비실시간 활동의 기본 시작 위치입니다.

메모리 내 데이터 #

Nakama의 메모리 내 데이터 시스템은 Redis와 같은 외부 메모리 내 데이터 저장소를 대신합니다. 내부적으로 Nakama는 Bleve를 사용하여 임의의 JSON 필드에 대한 전체 텍스트 검색의 잠금을 해제하므로 매우 빠른 다양한 검색이 가능합니다.

Nakama 메모리 내 데이터 시스템은 적절한 레이블이 있는 대결(예: 공개 및 가입) 또는 공통 속성(예: 마법 기술 수준 X)을 가진 플레이어를 정교하고 효율적인 매치메이킹으로 검색하기 위해 사용할 수 있습니다.

관리 #

Nakama의 관리 시스템은 대결 수명 주기 활동, 순위표토너먼트 일정, 매치메이킹, 서버 권한 부여 멀티플레이어 리소스 호스팅을 처리합니다.

가장 중요한 것은 이 시스템이 클라이언트 활동과 게임의 사용자 지정 서버 측 로직에서 사용하는 리소스를 관리한다는 것입니다.

메시지 라우팅 #

Nakama의 메시지 라우팅 시스템을 통해 실시간 클라이언트 메시지가 클러스터 전체에서 해당하는 노드에 확실하게 전달됩니다. 메시지 라우팅 시스템은 클라이언트에 대한 전체 클러스터의 소켓 연결 세트를 추적하고 클러스터의 토폴로지에 관계없이 수신되는 메시지를 해당 노드로 라우팅합니다. 메시지 라우팅 시스템은 채팅상태와 같은 Nakama의 모든 실시간 기능을 지원합니다.

현재 상태 #

현재 상태 추적 시스템은 게임에서 플레이어의 실시간 활동을 나타내기 위해 권한 부여를 기반으로 합니다. 플레이어의 현재 상태는 사용자, 세션, 사용자가 연결된 노드의 조합으로 고유하게 기록됩니다.

현재 상태를 통해 개발자는 플레이어가 일반적인 상태(예: 가능 또는 사용 중)를 설정하거나 친구에게 자유 형식 상태 메시지(예: “가입할 파티를 찾고 있습니다!")를 설정하거나 더 복잡한 상호 작용(예: 플레이어의 현재 대결을 관전할 친구 초대하기)을 작성하도록 지원할 수 있습니다.

스트림 #

Nakama는 스트림 시스템을 사용하여 클라이언트 간에 데이터를 효율적으로 공유합니다. 스트림은 채팅, 알림대결과 같은 실시간 활동에 대한 Nakama의 핵심적인 기능입니다.

데이터를 실시간으로 클라이언트에 배포해야 하는 경우 스트림을 통해 배포할 수 있습니다. 개별 플레이어 세션은 지속적인 메시지 흐름에 대한 구독 및 구독 취소와 같이 스트림에 가입하고 종료합니다.