Consigli sull'architettura delle applicazioni usando MongoDB per un intenso gioco multiplayer

3

Sto lavorando a un gioco di carte collezionabili multiplayer. Il lato server è node.js + websocket.io. Sto ora valutando quale database implementare.

Sono rimasto molto affascinato da MongoDB, principalmente per il fatto che posso scambiare JSON tra DB e la mia applicazione e anche perché posso descrivere l'intero stato di gioco in un documento mongodb. Dovrebbe anche leggere e scrivere più velocemente.

Tuttavia, ho notato che MongoDB non è eccezionale in termini di prestazioni quando si tratta di aggiornare i record esistenti.

Nel mio gioco questa è una caratteristica fondamentale, dato che lo stato del gioco cambierà sempre (con il turno di ogni giocatore).

Una delle soluzioni che stavo pensando è in realtà l'estrazione del documento di stato attuale del gioco, l'esecuzione di tutti i calcoli necessari e la semplice creazione di un nuovo documento in MongoDB per lo stesso gioco. In effetti, non aggiorno un record esistente, ma creo una nuova istanza di stato che selezionerò in seguito. E questo si ripete in poi.

Mi chiedo quanto sia giustificato tale approccio e quale sia il modo migliore di implementarlo? In qualche modo dovrò trovare il documento più recente nel filtro di raccolta da gameID e quindi utilizzare in qualche modo un timestamp del documento. C'è una funzionalità incorporata in MongoDB che potrebbe aiutarmi, qualsiasi suggerimento su cosa esplorare è molto apprezzato!

    
posta Vadimster 09.10.2017 - 20:16
fonte

2 risposte

4

Il modello di archiviazione del documento soddisfa i tuoi requisiti poiché non avrai bisogno di guardare più di un record alla volta.

Tuttavia! Vorrei sapere se hai bisogno di spazio di archiviazione. Se puoi inviare l'intero stato di gioco dal client con ciascuna "mossa", puoi eliminare completamente il livello dati e il tuo back-end sarebbe molto scalabile.

    
risposta data 09.10.2017 - 21:24
fonte
3

Il tuo piano sembra abusare di Mongo DB. Mongo DB è un database . Il suo scopo è di mantenere i dati, non di agire come memoria centrale (che è il piano corrente).

Per ciò che stai descrivendo, dovresti usare Redis. È un ottimo strumento per la memoria e la comunicazione tra processi, che è ciò che stai facendo.

Memorizza lo stato del gioco corrente in Redis, quindi una volta concluso il gioco, rimuovilo da Redis e salvalo in Mongo DB.

    
risposta data 09.10.2017 - 20:25
fonte

Leggi altre domande sui tag