Disclaimer: la mia esperienza di programmazione di gioco si basa su giochi single player lato client, ma ho un background in applicazioni web (in particolare nello stack Microsoft), quindi è da lì che provengo con questa risposta, penso che molto applicare, ma senza test reali di un vero server di gioco è difficile dire come verrà applicato, ma qui va. Sappi questo: non ho distribuito un server di gioco, solo webapps.
Suggerirei un approccio a due livelli (server). Un livello di database e un livello di "applicazione"; con il terzo livello (presentazione) il client di gioco.
Database relazionali, sono bravi a interrogare i dati e sono bravi a scrivere i dati. La chiave è serializzare le scritture del database in blocchi di dimensioni gestibili che il cluster può gestire. Le edizioni più avanzate (Data center / Enterprise) di SQL Server supportano il clustering e la replica. Vorrei iniziare creando un piccolo cluster ed eseguendo alcune query su di esso per vedere come funziona.
Nel livello dell'applicazione, se stai eseguendo una "suddivisione in zone" o qualcosa di simile, puoi probabilmente scappare senza impostare alcun cluster e semplicemente impostare un server per zona. Se le zone diventano troppo grandi, è possibile impostare un cluster per ogni zona.
È consigliabile creare un processo di serializzazione per l'invio di dati dal livello applicazione -> livello database. La chiave è avere diversi livelli di serializzazione in corso. Qualcosa del genere :
- Livello 1: salva su DB ogni X secondi, include dati critici:
- Salute del giocatore
- Oggetti giocatore / Pickup
- Livello 2: salva su DB ogni 2X secondi, include i dati medi:
- Posizione dei giocatori
- Posizioni NPC
- Livello 3: tutto il resto, il più raramente possibile
Ciò manterrà le tue scritture coerenti e prevedibili, a seconda della natura del tuo gioco, potresti avere scritture di database rare. La chiave è rendersi conto che se il server delle applicazioni si arrestasse in modo anomalo, sarebbe necessario tornare online dallo stato nel database, quindi serializzare l'inventario dei giocatori ogni 90 minuti potrebbe rendere i giocatori sconvolti.
Per leggere i dati, ti consigliamo di caricare quanto più memoria possibile nel livello applicazione, quindi assicurarti che tutto il codice utilizzi questo pool di memoria, in background puoi sincronizzare il pool di memoria con il database. Come sottolinea Joe, ci saranno momenti in cui hai bisogno di transazioni "in tempo reale". Serializzando la maggior parte delle tue scritture, dovresti comunque avere un IO sufficiente sul tuo database per eseguire transazioni in tempo reale quando necessario, presumendo un hardware sufficiente sul server / cluster del database.