Sto lavorando per ridimensionare un'applicazione che sta attualmente interrogando un database mySQL per inviare lavori asincroni a un sistema di elaborazione in background.
Una macchina a stati viene utilizzata per tenere traccia dell'avanzamento delle entità durante un flusso di lavoro. Ad esempio, potremmo avere tre stati:
- In programma
- Lavorazione
- Completa
Il mio piano è di aggiungere un sistema di code di messaggi per mediare i lavori inviati al sistema di elaborazione in background. Quindi Application A
inserirà una nuova entità, quindi invierà un messaggio alla coda. Application B
consumerebbe questi messaggi e li indirizzerebbe al processo di elaborazione in background corretto.
def do_work(entity)
# Precondition check
raise "Wrong State" unless entity.scheduled?
# Update state to processing
entity.processing
# ... do work
# Update state to complete
entity.complete
end
Dato un lavoro come sopra, sto avendo difficoltà a determinare come sarebbe possibile recuperare da una situazione in cui si è verificato un errore tra le transizioni di evento processing
e complete
. Ad esempio un crash del processo.
Il processore di lavoro riproverà il lavoro, ma ora l'entità si trova in uno stato incoerente e fallirebbe.
Come potrei gestire questo caso senza riportare al polling della tabella delle entità alla ricerca di processi obsoleti?
Modifica
Ci sono due concetti diversi in gioco qui. Abbiamo i dati e abbiamo lo stato dei dati in relazione all'esecuzione del lavoro (pianificato / di elaborazione) + lo stato del flusso di lavoro (completo).
Entrambe queste informazioni si trovano nella stessa tabella. Quindi, dopo che i dati sono cresciuti, il processo di polling diventa inefficiente (letture / aggiornamenti / inserimenti costantemente in corso).
Quindi forse una soluzione è avere Application B
spostare i lavori attivi in un datastore separato. Quindi, quando il task "clean up" a cui si riferisce @ Ӎσᶎ è in esecuzione, il set di dati dovrebbe essere molto più piccolo.
In definitiva, sembra che non ci sia modo di evitare il polling del database per garantire che i dati siano uno stato corretto.