Gestione di setTimeouts e setInterval in un ambiente distribuito

4

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:

  1. 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.

  2. 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!

    
posta Subra 01.06.2014 - 16:02
fonte

1 risposta

1

La migliore anima di questo è usare una coda di lavoro costruita su redis. Con ciò è possibile pianificare un'attività da eseguire in un dato momento. Questo dovrebbe sbarazzarsi di tutte le necessità di setimeout o setinterval. In passato, ho usato bull ( link ), mi è servito bene, ma ce ne sono altri.

Inoltre, il tuo piano iniziale potrebbe funzionare anche. Se è necessario mantenere sincronizzati i tempi del server, è necessario utilizzare ntp. Per quanto riguarda il punto 2, non penso che sia un grosso problema sondare le attività. Dovrebbe essere un modo semplice per vedere una chiave esiste.

    
risposta data 28.01.2017 - 04:38
fonte

Leggi altre domande sui tag