Sto costruendo un gioco turnbased su nodejs usando socket.io e redis come archivio dati. Sto pensando di ospitare il gioco su AWS opsworks con la possibilità di scalare aggiungendo altri nodi.
Come dovrei strutturare l'applicazione in modo che possa avere un comportamento simile a setTimeout
per funzionare correttamente nel caso in cui il nodo che ha attivato setTimeout
sia andato sotto per qualche motivo?
Il mio piano iniziale è di avere ogni setTimeout memorizzato in redis sotto un set ordinato, con il punteggio dell'evento come timestamp unix in cui dovrebbe essere eseguito. Vedo 2 problemi principali con questo approccio che non sono sicuro come affrontare:
-
L'ora del nodo che legge l'evento potrebbe non essere necessariamente sincronizzata con l'ora del nodo che l'ha archiviata, causando l'attivazione degli eventi prima o dopo rispetto a quanto previsto. Non sono sicuro di quanto grande possa essere un problema dato che un rapido googles rivela che la deriva sarà minima nel peggiore dei casi, ma mi manca qualche esperienza pratica per fare una sentenza su questo.
-
Non c'è modo per nessuno dei nodi 'worker' di sapere che potrebbe esserci un'attività dovuta, quindi dovrebbero eseguire il polling dei redis ogni secondo per vedere se c'è un compito che possono gestire. La soluzione ideale per questo sarebbe una pubblicazione / sottoscrizione che ha un ritardo incorporato, ma questo non sembra essere semplice da implementare.
Qualche consiglio su come risolvere questo problema è molto apprezzato!