Esiste un modo per assicurare il comportamento FIFO (first in, out out) con le code di attività su GAE?Esiste un modo per assicurare il comportamento FIFO (first in, first out) con le code di attività su GAE?
GAE documentazione dice che FIFO è uno dei fattori che influenzano l'ordine di esecuzione delle applicazioni, ma la stessa documentazione dice che “la pianificazione del sistema potrebbe 'saltare' nuovi compiti alla testa della coda” e mi hanno confermato questo comportamento con un test. L'effetto: i miei eventi sono in fase di elaborazione fuori servizio.
Docs dice:
https://developers.google.com/appengine/docs/java/taskqueue/overview-push
L'ordine in cui vengono eseguiti i compiti dipende da diversi fattori:
La posizione del compito nella coda. App Engine tenta di elaborare le attività in base all'ordine FIFO> (first in, first out). In generale, le attività vengono inserite alla fine di una coda e eseguite dal capo della coda.
L'arretrato delle attività in coda. Il sistema tenta di fornire la minima latenza possibile per qualsiasi attività specifica tramite notifiche appositamente ottimizzate per lo scheduler. Pertanto, nel caso in cui una coda abbia un ampio backlog di attività, la pianificazione del sistema può "saltare" nuove attività in testa alla coda.
Il valore della proprietà etaMillis dell'attività. Questa proprietà specifica l'ora che un'attività può essere eseguita. App Engine attende sempre fino all' dopo l'ETA specificato per elaborare le attività push.
Il valore della proprietà countdownMillis dell'attività. Questa proprietà specifica il numero minimo di di attesa prima di eseguire un'attività. Conto alla rovescia ed eta si escludono a vicenda; se ne specifichi uno, non specificare l'altro.
Cosa devo fare? Nel mio caso d'uso, elaborerò 1-2 milioni di eventi/giorno provenienti dai veicoli. Questi eventi possono essere inviati a qualsiasi intervallo (1 secondo, 1 minuto o 1 ora). L'ordine dell'elaborazione dell'evento deve essere garantito. Ho bisogno di elaborare per ordine di timestamp, che viene generato su un dispositivo incorporato all'interno del veicolo.
Cosa ho ora?
Un servlet Rest che viene chiamato dall'utente e crea un'attività (i dati degli eventi sono su payload).
Dopo questo, un servlet operaio ottenere questo compito e:
datiDeserialize evento;
Put Event su Datastore;
Aggiornamento veicolo su archivio dati.
Così, ancora una volta, non v'è alcun modo per assicurare solo il comportamento FIFO? O come posso migliorare questa soluzione per ottenere questo?
Perché hai bisogno di un FIFO rigoroso? Ricorda che l'ordine degli eventi è un po 'confuso in un sistema distribuito - anche il fatto di dire quale delle diverse richieste quasi simultanee sia avvenuta per prima è difficile (e spesso inutile) quando i tuoi frontend e backend sono distribuiti su più macchine. Cosa stai cercando di ottenere, come risultato finale? –
Monitoriamo gli autobus pubblici, quindi abbiamo bisogno di sapere quando si è fermato in una fermata dell'autobus, o quando ha aperto un viaggio, o quando ha superato i limiti di velocità. Il problema è che alcuni eventi sono correlati a eventi precedenti perché facciamo anche la gestione dello stato. Ad esempio: un autobus può solo "aprire un viaggio" se nell'evento precedente ha registrato un "viaggio chiuso". Quindi, puoi immaginare cosa può accadere se ottengo questi eventi fuori ordine ... –
Una coda di attività non sembra il modo migliore per farlo in ogni caso. Quello che si vuole fare è utilizzare le transazioni di archivio dati e limitare l'insieme di transizioni di stato per un dato bus solo a quelle consentite dalla macchina a stati. –