Azure Webjob Creazione e gestione del flusso di lavoro

3

Sto tentando di creare un lavoro di lunga durata da utilizzare in Azure. Mi piacerebbe essere in grado di eseguire più istanze di questo lavoro se ne avessi avuto bisogno.
Stavo pensando di separare la funzionalità principale in due diversi webjob. Con un lavoro chiamato "il cervello". mentre l'altro lavoro (s) sarebbe chiamato il lavoratore.

Brain dovrebbe essere in grado di sapere realmente quali lavori devono essere eseguiti e inserirli nei file di archiviazione di Azure che saranno ascoltati dai lavori dei lavoratori. Immagino alcune code diverse e pochi diversi operatori che gestiscono compiti diversi ascoltando le code.

La lista dei lavori è archiviata in un normale database con i valori relativi a quando deve essere eseguito successivamente e al tipo di lavoro. Brain controllerà periodicamente il database e otterrà il prossimo lavoro che deve essere eseguito. Trasferiscilo a una coda affinché un webjob di un operatore possa gestirlo e riscriverlo nel database se il lavoro viene eseguito regolarmente o semplicemente aggiornare lo stato nel database.

Domanda: Data questa configurazione, come gestiresti effettivamente il prossimo lavoro da eseguire (ciò che è successivo è basato su una data e un'ora) e impostando lo stato su "elaborazione" (quindi non viene selezionato due volte) in tale un modo in cui non ci sono possibilità che venga raccolto due volte (due istanze di Brain in esecuzione)? Sto usando EF6 in questo caso. C'è un modo per ottenere il record e aggiornarlo prima che chiunque altro possa farlo sul database?

Una versione più breve della domanda è Come posso tirare e aggiornare un record ed essere sicuro che non venga modificato mentre il processo sta accadendo usando EF6?

Dovrei usare un diverso tipo di gestione del lavoro? C'è un buon tutorial disponibile su un modo migliore per farlo?

    
posta Dan 01.09.2015 - 17:29
fonte

1 risposta

0

A shorter version of the question is How can I pull and update a record and be sure it is not modified while the process is happening using EF6?

Di solito uso il seguente. Supponi di dare un nome o un identificativo a ciascun "Cervello". Avvia una transazione, leggi se un lavoro è già stato eseguito (colonna "proprietario" = NULL), scrivi il tuo id nella colonna "proprietario". Commetti la transazione, quindi la rileggi. Ora la colonna può essere

  • NULL
  • il tuo ID
  • un altro ID

Se è NULL, ci riprovi (forse un altro Brain l'ha preso, non è riuscito e hai resettato il proprietario a NULL nel suo blocco finally ?), se è il tuo ID che hai "vinto" e puoi procedere, se è un altro, lascia che elabori la voce e ne cerchi un altro o vai a dormire. Questo è abbastanza flessibile; di solito funziona con SQL semplice (e con ORM sopra, come EF6) ma anche con altri sistemi, come redis.

Should I be using a different type of job management? Is there a good tutorial available on a better way to do this?

Un "modo" diverso di solito utilizzato con un sistema distribuito di massa è quello di consentire a due lavoratori di elaborare lo stesso elemento; se succede, e il processo è idempotente (elaborarlo una o due volte non cambia il risultato finale), basta lasciarlo accadere, sulla base del fatto che la sincronizzazione è più costosa dell'elaborazione effettiva. Questo modello funziona bene con le code di Azure. Vedi ad esempio questo articolo

In generale, una buona guida per Azure è su MSDN . Ho anche trovato molto interessante questo articolo . È vecchio, ma è molto chiaro e mi ha aiutato in passato.

    
risposta data 04.09.2015 - 12:16
fonte

Leggi altre domande sui tag