Per quanto riguarda il n. 2: l'interrogazione e l'aggiornamento di un database per ogni cambiamento di stato del gioco è un'idea estremamente buona , purché tu stia utilizzando un database corretto.
Ovviamente cose come MySQL possono essere subpotimal in questi casi (o forse no, dipende dalle dimensioni dello stato del gioco e dalla complessità del tuo modello). Se si utilizza un database NoSQL a bassa overhead che archivia le cose sul disco solo quando ha tempo, si avrà un sacco di prestazioni. La durata subirà, tuttavia; un arresto anomalo potrebbe perdere lo stato.
Naturalmente, è sciocco ricalcolare l'intero stato del gioco per ogni richiesta del cliente, se lo stato non è cambiato. Puoi memorizzare la parte comune hard-to-compute e solo ricalcolare parti dipendenti dal client, come "nebbia di guerra".
Questo ci porta all'idea di un database su più livelli. Le tue cose più importanti, come l'inventario degli utenti o il bilancio monetario, dovrebbero essere archiviate in un database durevole, come Postrges o MongoDB. (È incredibile quanto sia moderno il Postgres e quanto veloce possa essere scritto a Mongo.) Le cose che cambiano spesso, come la nebbia di guerra, le posizioni dei missili in volo, ecc., Dovrebbero vivere in un livello di cache, qualcosa come Redis o Memcached, e solo essere memorizzati nel negozio durevole quando si verifica un'azione irreversibile (colpi missilistici). I fatti più importanti dell'attuale tick del gioco dovrebbero essere calcolati una volta e memorizzati nel livello di cache, in una forma che permetta domande facili e invio immediato ai clienti.
Lo stato del livello di memorizzazione nella cache può essere perso a causa di un arresto anomalo senza conseguenze catastrofiche e può essere ricalcolato dai dati durevoli.
Questo è, naturalmente, in qualche modo complesso. Non andare fino a quando non hai un prototipo di lavoro crudo. Utilizza solo il negozio durevole (ad es. Postgres) finché non inizi a risolvere i problemi di prestazioni e hai identificato questi problemi come correlati al database. Quindi vedrai cosa memorizzare nella cache.