Avertissement: mon expérience de programmation de jeux est basée sur des jeux solo côté client, mais j'ai une expérience dans les applications Web (en particulier sur la pile Microsoft), c'est donc de là que je viens avec cette réponse, je pense que beaucoup appliquer, mais sans tester réellement un vrai serveur de jeu, il est difficile de dire comment il s'appliquera, mais voilà. Sachez ceci: je n'ai pas déployé de serveur de jeu, seulement des webapps.
Je suggérerais une approche à deux niveaux (serveur). Un niveau base de données et un niveau "application"; avec le troisième niveau (présentation) étant votre client de jeu.
Les bases de données relationnelles sont excellentes pour interroger des données et décentes pour écrire des données. La clé est de sérialiser vos écritures de base de données en morceaux de taille gérable que votre cluster peut gérer. Les éditions les plus avancées (centre de données / entreprise) de SQL Server prennent en charge la mise en cluster et la réplication. Je commencerais par créer un petit cluster et exécuter des requêtes sur lui pour voir comment cela fonctionne.
Dans le niveau application, si vous effectuez un "zonage" ou quelque chose de similaire, vous pouvez probablement vous en sortir sans configurer de cluster, et simplement configurer un serveur par zone. Si vos zones deviennent trop grandes, vous pouvez configurer un cluster pour chaque zone.
Vous souhaiterez créer un processus de sérialisation pour envoyer des données à partir du niveau application -> niveau base de données. La clé est d'avoir plusieurs niveaux de sérialisation en cours. Quelque chose comme ça:
- Niveau 1: Enregistrer dans la base de données toutes les X secondes, inclut les données critiques:
- Santé des joueurs
- Objets / micros des joueurs
- Niveau 2: enregistrer dans la base de données toutes les 2X secondes, comprend des données moyennes:
- Emplacements des joueurs
- Emplacements des PNJ
- Niveau 3: tout le reste, aussi rarement que possible
Cela gardera vos écritures cohérentes et prévisibles, selon la nature de votre jeu, vous pourriez avoir des écritures de base de données peu fréquentes. La clé est de réaliser que si votre serveur d'applications tombe en panne, vous devrez revenir en ligne à partir de l'état de votre base de données, de sorte que la sérialisation de l'inventaire des joueurs toutes les 90 minutes pourrait perturber les joueurs.
Pour lire les données, vous souhaiterez charger autant que possible en mémoire dans le niveau d'application, puis assurez-vous que tout votre code utilise ce pool de mémoire.En arrière-plan, vous pouvez synchroniser le pool de mémoire avec la base de données. Comme Joe le souligne, il y aura des moments où vous aurez besoin de transactions «en temps réel». En sérialisant la plupart de vos écritures, vous devriez toujours avoir suffisamment d'E / S sur votre base de données pour effectuer des transactions en temps réel si nécessaire, en supposant que le matériel est suffisant sur le serveur / cluster de base de données.