How a team of just two engineers tackled real-time persisted events for hundreds of millions of players Avec seulement deux ingénieurs, Supercell a assumé la tâche difficile de développer son système de compte de base en une plate-forme sociale connectant des centaines de millions de joueurs. la gestion des comptes, les demandes d'amis, les promotions cross-game, le chat, le suivi de la présence des joueurs et la formation d'équipe - tout cela devait fonctionner à travers leurs cinq jeux principaux. L'ingénieur serveur de Supercell, Edvard Fagerholm, a récemment partagé comment leur puissante équipe de deux personnes a réussi à résoudre cette tâche. Remarque : Si vous aimez entendre parler de réalisations d'ingénierie comme celle-ci, rejoignez-nous au Monster Scale Summit (gratuit + virtuel). Les ingénieurs de Disney+/Hulu, Slack, Canva, Uber, Salesforce, Atlassian et plus partageront des stratégies et des études de cas. Remarque : Si vous aimez entendre parler de réalisations d'ingénierie comme celle-ci, rejoignez-nous au Monster Scale Summit (gratuit + virtuel). Les ingénieurs de Disney+/Hulu, Slack, Canva, Uber, Salesforce, Atlassian et plus partageront des stratégies et des études de cas. note Monstres à l'échelle Titre : Qui est Supercell ? Supercell est la société basée en Finlande derrière les jeux de succès Hay Day, Clash of Clans, Boom Beach, Clash Royale et Brawl Stars. Jusqu'à récemment, toutes les fonctionnalités de gestion de compte pour les jeux servant des centaines de millions d'utilisateurs actifs mensuels étaient construites et gérées par seulement deux ingénieurs. La génération de Supercell ID Supercell ID est né comme un système de compte de base – quelque chose pour aider les utilisateurs à récupérer des comptes et les déplacer vers de nouveaux appareils. Edvard a expliqué : « Le client pouvait exécuter des requêtes HTTP à l’API du compte, qui renvoyait principalement des jetons signés que le client pouvait présenter au serveur de jeu pour prouver leur identité. Certaines opérations, comme faire des demandes d’amis, nécessitaient de l’API du compte pour envoyer une notification à un autre joueur. Par exemple, « Approuvez-vous cette demande d’ami ? » À cette fin, il y avait une file d’événement pour les notifications. Entrez dans la communication à deux voies Après Edvard a rejoint le projet Supercell ID à la fin de 2020, il a commencé à travailler sur le backend de notification – principalement pour la promotion croisée à travers leurs cinq jeux. Clients connectés à une flotte de serveurs proxy, puis un mécanisme de routage a poussé les événements directement vers les clients (sans passer par le jeu). Ceci était suffisant pour l'objectif immédiat de gérer les demandes de promotion croisée et d'amis. Ils ont réalisé qu’ils pouvaient utiliser la communication bidirectionnelle pour augmenter considérablement la portée du système d’identification Supercell. Edvard a expliqué : « Fondamentalement, cela nous a permis de mettre en œuvre des fonctionnalités qui faisaient auparavant partie du serveur de jeu. Avec cela, Supercell ID a commencé à se transformer en un réseau social cross-game qui supportait des fonctionnalités telles que les graphiques d'amis, l'équipe, le chat et le suivi de l'état d'ami. Evoluer Supercell ID en réseau social cross-game À ce stade, le côté du réseau social du backend était toujours un projet individuel, donc ils l'ont conçu avec simplicité à l'esprit. Trouver la bonne abstraction « Nous voulions seulement avoir une abstraction simple qui soutiendrait tous nos usages et pouvait donc être conçue et mise en œuvre par un seul ingénieur », explique Edvard. « En d’autres termes, nous voulions éviter de construire un système de chat, un système de présence, etc. Nous voulions construire une chose, pas beaucoup. » Trouver la bonne abstraction était la clé. Et un entrepôt de valeur clé hiérarchique avec Change Data Capture correspond parfaitement à la facture. Voici comment ils l'ont mis en œuvre: Les clés de niveau supérieur dans le magasin de valeurs clés sont des sujets auxquels vous pouvez vous abonner. Il y a une carte à deux niveaux sous chaque clé de haut niveau - carte (chaîne, carte (chaîne, chaîne)). Toute modification des données sous une clé de haut niveau est diffusée à tous les abonnés de cette clé. Les valeurs dans la carte la plus profonde sont également timestampées.Chaque source de données contrôle ses propres timestamps et définit l'ordre correct.Le client rejette toute mise à jour avec un timestamp plus ancien que ce qu'il a déjà stocké. Carte de la chaîne (String, String) Un changement typique dans les données serait quelque chose comme le changement de « niveau égale 10 » à « niveau égale 11 ». au fur et à mesure que les joueurs jouent, ils déclenchent toutes sortes de mises à jour comme cela, ce qui signifie qu'un grand nombre de petits scripts sont impliqués dans la persistance de tous les événements. Trouver la bonne base de données Ils avaient besoin d’une base de données qui soutienne leurs exigences techniques et soit gérable, compte tenu de leur équipe minimaliste. Gère de nombreux petits enregistrements avec une faible latence Supporte un modèle de données hiérarchique Gérer les sauvegardes et les opérations de cluster en tant que service ScyllaDB Cloud s'est avéré être un excellent choix. (ScyllaDB Cloud est la version entièrement gérée de ScyllaDB, une base de données connue pour fournir une latence prévisible à faible échelle). Comment tout se joue Pour une idée de la façon dont cela se déroule dans les jeux Supercell, regardons deux exemples. Un simple message de chat pourrait être représenté dans leur modèle de données comme suit: Edvard a expliqué : « La clé de niveau supérieur à laquelle on est abonné est l’ID de la salle de chat. La clé de niveau suivant est un timestamp-UID, de sorte que nous avons un ordre de chaque message et que nous pouvons demander l’historique du chat. La carte interne contient le message réel ainsi que d’autres données qui y sont jointes. » Ensuite, regardons la « présence », qui est largement utilisée dans le nouveau jeu (et très attendu) de Supercell, mo.co. Le but de la présence, selon Edvard: « Lorsque vous vous unissez pour la bataille, vous voulez voir en temps réel l'avatar et la construction actuelle de vos amis - essentiellement les armes et l'équipement de vos amis, ainsi que ce qu'ils font. Players’ state data is encoded into Supercell’s hierarchical map as follows: Note that: Le niveau supérieur est l'ID du joueur, le deuxième niveau est le type, et la carte interne contient les données. Supercell ID n’a pas besoin de comprendre les données ; il ne fait que les transmettre aux clients de jeux. Les clients de jeux n'ont pas besoin de connaître le graphique de l'ami puisque le routage est géré par Supercell ID. En approfondissant l’architecture du système Terminons par une visite de l'architecture du système, comme l'a fourni Edvard. « Le backend est divisé en APIs, proxy et serveurs de routage / stockage d’événements. Les sujets vivent sur les serveurs de routage d’événements et sont divisés entre eux. Un client se connecte à un proxy, qui gère l’abonnement du sujet du client. Le proxy route ces abonnements vers les serveurs de routage d’événements appropriés. Les endpoints (par exemple, pour le chat et la présence) envoient leurs données aux serveurs de routage d’événements, et tous les événements persistent dans le Cloud ScyllaDB. Chaque thème a un shard primaire et de sauvegarde. Si le shard primaire tombe, le shard primaire maintient les numéros de séquence de mémoire pour chaque message pour détecter les messages perdus. Le secondaire transmet les messages sans numéros de séquence. Si le primaire tombe, le primaire déclenchera un rafraîchissement de l'état sur le client, ainsi que la réinitialisation des numéros de séquence. L'API pour les couches de routage est un simple RPC post-événement contenant un lot de thèmes, de types, de clés, de valeurs. Le travail de chaque API est simplement de réécrire leurs données dans la représentation de la couche de routage ci-dessus. Chaque événement est écrit en ScyllaDB avant d'être diffusé aux abonnés. Nos API sont synchrones dans le sens que si un appel API donne une réponse réussie, le message persiste dans ScyllaDB. Envoyer le même événement plusieurs fois ne fait pas de mal puisque l'application de la mise à jour sur le client est une opération idempotente, à l'exception éventuellement de multiples numéros de séquence cartographiant le même message. Lors de la connexion, le proxy découvre tous vos amis et s'abonne à leurs sujets, de même pour les groupes de chat auxquels vous appartenez.Nous nous abonnerons également aux sujets pour le client connectant.Ces sujets sont utilisés pour envoyer des notifications au client, tels que les demandes d'amis et les promotions croisées. Un redémarrage du routeur déclenche une réabonnement aux sujets à partir du proxy. Nous utilisons des buffers de protocole pour économiser sur le coût de la bande passante. Tout équilibrage de la charge est au niveau TCP pour garantir que les demandes sur la même connexion HTTP/2 sont traitées par le même socket TCP sur le proxy. Cela nous permet de cacher certaines informations dans la mémoire lors de l'écoute initiale, de sorte que nous n'avons pas besoin de refetch sur d'autres demandes. Nous avons suffisamment de clients simultanés que nous n'avons pas besoin de charger séparément les demandes HTTP/2 individuelles, car le trafic est uniformément distribué de toute façon, et les demandes sont à peu près aussi coûteuses à traiter entre différents utilisateurs. Nous utilisons des sockets persistants entre les proxies et les routeurs. De Mais ce n'est pas Game Over Si vous voulez regarder la conversation technique complète, appuyez simplement sur le jeu ci-dessous: Et si vous voulez en savoir plus sur le rôle de ScyllaDB dans le monde du jeu, vous voudrez peut-être également lire: Epic Games : Comment Epic Games utilise ScyllaDB comme cache binaire devant NVMe et S3 pour accélérer la distribution mondiale des grands actifs de jeu utilisés par Unreal Cloud DDC. Tencent Games: Comment Tencent Games a construit une architecture de service basée sur les modèles de CQRS et de sourcing d'événements avec Pulsar et ScyllaDB. Discord : Comment Discord utilise ScyllaDB pour stimuler leur croissance massive, passant d’une plateforme de jeu de niche à l’une des plus grandes plateformes de communication au monde. Jeux Epic : Jeux Tencent : Le discord :