Architettura per il monitoraggio di molti minigiochi

1

Nel mio progetto, creerò molti minigiochi. Questi mini giochi possono durare da 30 secondi a 1 settimana (la durata del gioco viene decisa quando viene creata ed è fissa).

Il numero di giochi concorrenti può essere grande (più di 1 partita per utente e speriamo di avere molti utenti ovviamente: -)).

Nulla accade veramente durante il gioco. Sono composti solo da una condizione vincente e un tempo di fine.

Una volta che il gioco è terminato, ho bisogno che il server controlli le condizioni vincenti (usando un servizio remoto) e finalizzi il gioco (decidi chi ha vinto e dai punti). Durante il gioco, il server non ha bisogno di gestirlo.

Puoi pensare ai giochi come alle scommesse. Qualcuno scommette che succederà qualcosa in 30 secondi e dopo 30 secondi ho bisogno di verificare se qualcosa è realmente accaduto e aggiornare il sistema.

La latenza della finalizzazione del gioco dovrebbe essere molto veloce, specialmente per le partite brevi. Non più di un secondo o due. Io, per un gioco di 30 secondi, dovrei essere in grado di aggiornare se ha vinto o perso un secondo o due dopo la fine.

Ho pensato di mantenere ogni gioco su una riga in una tabella sql e pianificare un'attività da eseguire quando finisce e finalizzarla.

Ad esempio, un utente inizia una partita di 1 minuto. Il server creerà il gioco nel db e pianificherà un'attività da eseguire in 1 minuto (e passerà l'id del gioco). Quando l'attività si innesca, finalizzerà il gioco e aggiornerà il suo stato nel db.

Ci sono altri modi per risolvere questo problema? Forse qualcosa che non richiede un compito per partita? Ho pensato anche di avere 1 compito che controllerà tutti i giochi finiti, ma per i giochi brevi (ad esempio 30 secondi) il tempo di polling deve essere molto breve e non sono sicuro di quanto possa scalare.

    
posta daramasala 18.12.2014 - 20:30
fonte

3 risposte

1

Dato che hai menzionato la scalabilità e la velocità è importante per te, vorrei proporre la Coda messaggi come l'architettura per la tua applicazione. Avrai bisogno di ricercare esempi nella tua tecnologia di scelta. Ecco un Wiki per la descrizione generale ( link ).

L'idea è semplice. I clienti (i tuoi giochi) inviano messaggi (risultati di gioco) al gestore code. Il Manager invia questi messaggi alle subroutine che li elaborano. Man mano che la tua applicazione cresce, puoi aggiungere più gestori per elaborare i messaggi. Pertanto, ridimensiona orizzontalmente. Man mano che aggiungi altri giochi (che molto probabilmente avranno formati di risultato e subroutine diversi per elaborare quei risultati ... cioè scacchi, poker o Go) puoi aggiungere più subroutine che possono elaborare quei risultati. Qui si scala verticalmente.

    
risposta data 18.12.2014 - 21:18
fonte
0

Sono abbastanza sicuro che ci sia una rappresentazione canonica del mio problema. Ad esempio, puoi pensare ai giochi come attività che devono iniziare in un momento specifico (l'ora di fine del gioco). Immagino che questo sia un qualche tipo di problema di programmazione.

Per il mio caso, ho 2 soluzioni.

  1. La soluzione "ingenua": ho un'attività che si sveglia ogni secondo circa, carica tutti i giochi che devono essere finalizzati dal db e finalizzati. Solo un task gestisce tutti i giochi, il che significa che quando ci sono molti giochi, la latenza aumenterà. Ma almeno si degrada lentamente e non si disintegra. Inoltre, non dipende dal numero di giochi concorrenti, ma solo dal numero di giochi che terminano ad ogni secondo.

  2. Poiché utilizzo Azure, ho pensato di utilizzare la coda di archiviazione. I messaggi nella coda di archiviazione di Azure possono avere un tempo di "invisibilità", quindi posso inserire ciascun gioco nella coda e impostarlo in modo invisibile finché non è il momento di finalizzarlo. Quindi posso avere tutti i thread che mi piacciono leggendo i giochi dalla coda e finalizzandoli. Ma non sono sicuro che la coda sia ottimizzata per un tale caso d'uso.

risposta data 18.01.2015 - 08:16
fonte
0

Vorrei andare per l'approccio all'utilizzo della tabella, tuttavia farei una leggera modifica al modo in cui vengono elaborati. Invece di girare un'attività per ogni singola riga, creerei il numero di attività di monitoraggio e loro eseguiranno un SQL sulla tabella corrente per scoprire quali giochi necessitano di essere finalizzati in un dato punto e in base al numero di attività di monitoraggio che distribuiranno il numero di righe tra di loro in base a una sorta di ordinamento e prendendo una certa quantità di righe.

    
risposta data 18.01.2015 - 09:15
fonte

Leggi altre domande sui tag