Distribuzione di un set di "Lavori" su più computer

3

Sono piuttosto nuovo nell'informatica distribuita e vorrei ricevere assistenza con l'architettura generale della mia applicazione.

La mia applicazione ha lavori che possono essere aggiunti a un JobQueue. Quindi è possibile configurare una o più istanze di JobRunner per eseguire i lavori in coda e generare JobResults. I JobResults verranno quindi inviati ad alcune destinazioni come un rapporto, un file di registro, una notifica via email ecc.

Tuttavia, voglio anche essere in grado di raggruppare un gruppo correlato di lavori in un JobSet che a sua volta verrà elaborato in un JobSetResult che contiene tutti i JobResult corrispondenti. Ogni Job, comunque, sarà comunque elaborato indipendentemente da un JobRunner. Una volta che tutti i JobResults sono stati raccolti, il JobResult finale verrà inviato ad alcune destinazioni come una notifica di log o email.

Ad esempio, un utente può creare un insieme di lavori per elaborare un elenco di file. Creerebbero un JobSet contenente un numero di FileProcessingJobs e lo invieranno per essere eseguiti. Ovviamente non voglio che l'utente ottenga una notifica via e-mail per ogni file, ma solo il JobSetResult finale quando l'intero JobSet è completo.

Ho problemi a trovare il modo migliore per tenere traccia di tutto ciò in un ambiente distribuito. C'è qualche schema di progettazione architettonica esistente che corrisponde a quello che sto cercando di fare?

    
posta Eric 06.12.2014 - 00:31
fonte

2 risposte

1

Penso che la soluzione al tuo problema è che hai un thread principale che sta gestendo alcuni aspetti della tua applicazione e i thread di JobRunner che sembrano eseguire più processi di business logic.

Se hai intenzione di passare all'elaborazione parallela, non immergere i piedi nella piscina, saltare direttamente dentro e fare di ogni logica nella tua applicazione un lavoro. Tutto dovrebbe essere asincrono, compresa la creazione di risultati elaborati da JobSet ed e-mail.

Se hai familiarità con l'elaborazione di Batch, questo è come un paradigma massivamente parallelo. Ogni corridore dovrebbe avere tre aspetti distinti.

  • Lettore - Legge in un blocco da un'origine o da un archivio dati che un particolare tipo di Runner dovrebbe elaborare.
  • Processore - Elabora quella parte di dati con la logica
  • Writer - Persiste il risultato finale per essere raccolto in seguito da un chunk futuro.

Se si progettano correttamente i corridori, possono essere costantemente in esecuzione e cercare più blocchi da leggere, elaborare ad-hoc e scrivere per un altro tipo di Runner da raccogliere con il proprio Reader.

Esistono framework che supportano questo tipo di sviluppo di applicazioni, Apache Hadoop . Costruisce questa infrastruttura per te in modo che tu possa concentrarti sulla progettazione e sulla logica di business anziché sul codice boilerplate.

    
risposta data 06.12.2014 - 15:05
fonte
0

La tua scelta del framework deciderà l'API esatta, ma quello che stai cercando di fare è un compito abbastanza comune.

Hai bisogno di un concetto di JobSet . Alcuni quadri ti forniranno un tale concetto. Vorrei concentrarmi sulla scelta del tuo framework e sulla ricerca di come quel framework farà ciò che vuoi. Quello che vuoi è un desiderio molto comune, quindi dovrebbe essere supportato da qualsiasi quadro ragionevole.

Ma, se per qualche motivo, scegli un framework che non lo fa per te ...

Se il tuo framework scelto non fa questo per te, dovrai mantenere un file di testo con tutti i lavori nel tuo JobSet (popolarlo mentre invii i lavori). Ogni volta che un lavoro viene completato, apre il file e si rimuove dall'elenco dei lavori in sospeso. Se è l'ultimo lavoro all'interno di un JobSet, esegue quindi lo script "gather" prima di finire.

    
risposta data 06.12.2014 - 17:34
fonte

Leggi altre domande sui tag