How a team of just two engineers tackled real-time persisted events for hundreds of millions of players 단지 두 명의 엔지니어로, Supercell은 기본 계정 시스템을 수억 명의 게이머를 연결하는 소셜 플랫폼으로 성장시키는 어려운 작업을 수행했습니다. 계정 관리, 친구 요청, 크로스 게임 프로모션, 채팅, 플레이어 현존 추적 및 팀 구성 -이 모든 것이 5 개의 주요 게임을 통해 작동해야했습니다.그리고 그들은 단일 엔지니어가 유지하기에 충분히 간단하지만 실시간으로 대규모 수요를 처리하기에 충분히 강력한 단일 솔루션으로 모든 것을 다루기를 원했습니다. Supercell의 서버 엔지니어 인 Edvard Fagerholm은 최근 두 명의 강력한 팀이이 작업에 어떻게 대처했는지 공유했습니다.이 작업을 통해 간단한 계정 관리 도구를 운영 단순성과 높은 성능을 우선시하는 포괄적 인 게임 간 소셜 네트워크 인프라로 변환하는 방법을 알아보십시오. 참고: 이와 같은 엔지니어링 업적에 대해 듣는 것을 좋아한다면 Monster Scale Summit (무료 + 가상)에서 우리와 함께하십시오.Disney+ / Hulu, Slack, Canva, Uber, Salesforce, Atlassian 및 기타 엔지니어는 전략 및 사례 연구를 공유 할 것입니다. 참고: 이와 같은 엔지니어링 업적에 대해 듣는 것을 좋아한다면 Monster Scale Summit (무료 + 가상)에서 우리와 함께하십시오.Disney+ / Hulu, Slack, Canva, Uber, Salesforce, Atlassian 및 기타 엔지니어는 전략 및 사례 연구를 공유 할 것입니다. 노트 몬스터 스케일 Summit 다음글 : 누가 슈퍼셀인가? 슈퍼셀은 핀란드에 본사를 둔 게임 Hay Day, Clash of Clans, Boom Beach, Clash Royale 및 Brawl Stars 뒤에 있는 회사입니다. 얼마 전까지 수백만 명의 월간 활성 사용자를 지원하는 게임에 대한 모든 계정 관리 기능은 단지 두 명의 엔지니어에 의해 구축되고 관리되었습니다. 다음글 : Supercell ID Supercell ID는 사용자가 계정을 복구하고 새로운 장치로 이동하는 데 도움이되는 기본 계정 시스템으로 태어났습니다. 에드워드는 “클라이언트는 주로 서명된 토큰을 게임 서버에 제출하여 자신의 신원을 증명할 수 있는 계정 API에 HTTP 쿼리를 수행할 수 있다”고 설명했다. “친구 요청을 하는 것과 같은 일부 작업은 계정 API가 다른 플레이어에게 알림을 보내도록 요구했다. 예를 들어, ‘당신은 이 친구 요청을 승인합니까?’ 2 방향 통신 에드워드가 2020 년 말에 Supercell ID 프로젝트에 합류 한 후, 그는 알림 백엔드 (notification backend) 작업을 시작했으며, 주로 5 개의 게임을 통해 교차 프로모션을 제공했습니다. 클라이언트는 프록시 서버의 함대에 연결되었고, 라우팅 메커니즘은 이벤트를 클라이언트에게 직접 밀어 넣었습니다 (게임을 통과하지 않고).이것은 크로스 프로모션과 친구 요청을 처리하는 즉각적인 목표에 충분했습니다. 그러나 그들은 Supercell ID 시스템의 범위를 크게 확대하기 위해 양방향 커뮤니케이션을 사용할 수 있다는 것을 깨달았습니다.Edvard는 설명했다, “본질적으로, 그것은 이전에 게임 서버의 일부였던 기능을 구현 할 수있었습니다.우리의 목표는 개발 중인 모든 새로운 게임이 필요로 할 수있는 기능을 채택하고 시스템에 포장하는 것이었습니다. 이에 따라 Supercell ID는 친구 차트, 팀 구성, 채팅 및 친구 상태 추적과 같은 기능을 지원하는 크로스 게임 소셜 네트워크로 전환하기 시작했습니다. 슈퍼셀 ID가 크로스 게임 소셜 네트워크로 진화 이 시점에서 백엔드의 소셜 네트워크 측면은 여전히 단일 프로젝트였으므로 단순함을 염두에두고 설계했습니다. 올바른 추상화를 찾는 방법 "우리는 단지 하나의 간단한 추상화를 원했고, 따라서 하나의 엔지니어에 의해 설계되고 구현 될 수있었습니다."라고 Edvard는 설명했다. "다른 말로, 우리는 채팅 시스템, 존재 시스템 등을 구축하는 것을 피하고 싶었습니다. 올바른 추상화를 찾는 것이 핵심이었으며 Change Data Capture를 사용하는 계층적 키 값 저장소가 계좌에 완벽하게 맞습니다. Key-value store의 상위 레벨 키는 구독할 수 있는 주제입니다.The top-level keys in the key-value store are topics that can be subscribed to. 각 상위 수준의 키 아래에 두 층의지도가 있습니다 - map(string, map(string, string)). any change to the data under a top level key is broadcast to all that key's subscribers. 가장 깊은 지도의 값도 타임스탬프로 표시됩니다. 각 데이터 소스는 자체 타임스탬프를 제어하고 올바른 순서를 정의합니다.The client drops any update with an older timestamp than what it has already stored. 도서관(String, String, String) 데이터의 전형적인 변화는 ‘레벨은 10에 해당하는 것’과 ‘레벨은 11에 해당하는 것’과 같은 것이며, 플레이어가 플레이하는 동안이와 같은 모든 종류의 업데이트를 촉발시켜 모든 이벤트를 지속시키는 데 많은 작은 글자가 참여한다는 것을 의미합니다. 올바른 데이터베이스 찾기 그들은 그들의 기술적 요구 사항을 지원하고 관리 할 수있는 데이터베이스가 필요했으며, 그들의 미니멀 팀을 감안할 때 다음과 같은 기준으로 번역되었습니다. 낮은 지연률을 가진 많은 작은 글쓰기를 처리합니다.Handles many small writing with low latency Hierarchical Data Model을 지원합니다. 서비스로서 백업 및 클러스터 작업을 관리 ScyllaDB Cloud는 매우 적합한 것으로 밝혀졌습니다. (ScyllaDB Cloud는 ScyllaDB의 완전히 관리 된 버전이며, 규모에서 예측 가능한 낮은 지연 시간을 제공하는 데 알려진 데이터베이스입니다). How it all plays out (모든 것이 어떻게 연주되는지) 이것이 슈퍼 셀 게임에서 어떻게 작동하는지에 대한 아이디어를 얻으려면 두 가지 예를 살펴보자. 먼저, 채팅 메시지를 고려하십시오.단순한 채팅 메시지는 데이터 모델에서 다음과 같이 표현될 수 있습니다: 에드워드 (Edvard)는 설명했다, "최고 수준의 열쇠는 채팅 룸 ID입니다.다음 수준의 열쇠는 타임스탬프-UID입니다, 그래서 우리는 각 메시지의 순서를 가지고 있으며 채팅 기록을 쿼리 할 수 있습니다. 다음으로, 슈퍼셀의 새로운 (그리고 매우 기대되는) 게임, mo.co.에 많이 사용되는 "현재"를 살펴보자 에드워드에 따르면 현존의 목표 : "전투를 위해 팀을 만들 때, 당신은 실시간으로 아바타와 당신의 친구의 현재 구축을보고 싶습니다 - 기본적으로 당신의 친구의 무기와 장비뿐만 아니라 그들이하는 일. Players’ state data is encoded into Supercell’s hierarchical map as follows: Note that: 상단 레벨은 플레이어 ID, 두 번째 레벨은 타입이며 내부지도에는 데이터가 포함되어 있습니다. Supercell ID는 데이터를 이해할 필요가 없으며 단순히 게임 클라이언트에게 전달합니다. 게임 클라이언트는 Supercell ID가 라우팅을 처리하기 때문에 친구 차트를 알 필요가 없습니다. 시스템 아키텍처에 깊이 들어가기 에드워드가 제공한 시스템 아키텍처의 투어로 마무리하자. 백엔드는 API, 프록시 및 이벤트 라우팅/스토리지 서버로 나뉘어져 있습니다. 주제는 이벤트 라우팅 서버에 살고 있으며 그들 사이에 분할됩니다. 클라이언트는 클라이언트의 주제 구독을 처리하는 프록시에 연결합니다.프록시는 해당 이벤트 라우팅 서버로 이러한 구독을 라우팅합니다.Endpoints (예를 들어, 채팅 및 현존)는 이벤트 라우팅 서버에 데이터를 전송하며 모든 이벤트는 ScyllaDB Cloud에서 지속됩니다. 각 테마에는 기본 및 백업 해드가 있습니다. 기본이 떨어지면 기본 해드가 각 메시지에 대한 메모리 시퀀스 번호를 유지하여 잃어버린 메시지를 탐지합니다. 두 번째 메시지는 시퀀스 번호없이 메시지를 전송합니다. 기본이 떨어지면 기본이 클라이언트에 상태를 새로 고치고 시퀀스 번호를 재설정합니다. 라우팅 레이어에 대한 API는 주제, 유형, 키, 값 튜플의 배치를 포함하는 간단한 이벤트 후 RPC입니다. 각 API의 작업은 위의 튜플 표현에 데이터를 다시 작성하는 것입니다. 각 이벤트는 구독자에게 방송하기 전에 ScyllaDB로 작성됩니다. 우리의 API는 API 호출이 성공적으로 응답하면 메시지가 ScyllaDB에서 지속되었습니다. 동일한 이벤트를 여러 번 보내는 것은 클라이언트에 업데이트를 적용하는 것이 idempotent 작업이기 때문에 해를 끼치지 않습니다. 연결할 때 프록시는 모든 친구를 찾고 그들의 주제에 가입할 수 있습니다.우리는 또한 연결 클라이언트의 주제에 가입합니다.이 주제는 친구 요청과 교차 프로모션과 같은 클라이언트에 알림을 보내기 위해 사용됩니다. 라우터 재부팅은 프록시에서 주제에 대한 재 가입을 촉발합니다.A router reboot triggers a resubscribe to topics from the proxy. 우리는 프로토콜 버퍼를 사용하여 대역폭 비용을 절약합니다. 모든 로드 밸런싱은 동일한 HTTP/2 연결을 통한 요청이 프록시에서 동일한 TCP 소켓에 의해 처리되는 것을 보장하기 위해 TCP 수준에 있습니다. 이것은 우리가 초기 듣기에 메모리에서 특정 정보를 캐시 할 수 있으므로 다른 요청에 대해 재팩을 할 필요가 없습니다. 우리는 개별 HTTP/2 요청을 별도로 로드 밸런스를 할 필요가 없기 때문에 트래픽이 어쨌든 균등하게 분포되며 요청은 다른 사용자들 사이에서 처리하는 데 거의 동등한 비용이 있습니다. 우리는 프록시와 라우터 사이에 지속적인 소켓을 사용합니다. 그러나 그것은 게임 끝이 아닙니다 당신이 완전한 기술 대화를보고 싶다면, 그냥 아래에서 재생을 누르십시오 : 그리고 게임 세계에서 ScyllaDB의 역할에 대해 더 알고 싶다면 다음을 읽고 싶을 수도 있습니다. Epic Games : Epic Games가 NVMe 및 S3 앞에서 ScyllaDB를 바이너리 캐시로 사용하여 Unreal Cloud DDC에서 사용하는 대형 게임 자산의 글로벌 배포를 가속화하는 방법. Tencent Games: Tencent Games가 Pulsar 및 ScyllaDB를 사용하여 CQRS 및 이벤트 소싱 패턴을 기반으로 서비스 아키텍처를 구축하는 방법. Discord : Discord는 ScyllaDB를 사용하여 니치 게임 플랫폼에서 세계 최대의 커뮤니케이션 플랫폼 중 하나로 이동하여 대규모 성장을 촉진하는 방법. 에픽 게임 : 텐센트 게임 : 분리 :