2011-10-12 15 views
5

Sto usando RabbitMQ per fare in modo che i processi di lavoro codifichino i file video. Vorrei sapere quando tutti i file sono completi, ovvero quando tutti i processi di lavoro sono terminati.Come sapere quando una serie di attività RabbitMQ è completa?

L'unico modo che posso pensare di farlo è quello di utilizzare un database. Quando un video termina codifica:

UPDATE videos SET status = 'complete' WHERE filename = 'foo.wmv' 
-- etc etc etc as each worker finishes -- 

E poi per verificare se tutti i video sono stati codificati:

SELECT count(*) FROM videos WHERE status != 'complete' 

Ma se ho intenzione di fare questo, allora mi sento come se sto perdendo il vantaggio di RabbitMQ come meccanismo per più processi di lavoro distribuiti, dal momento che devo ancora mantenere manualmente una coda di database.

Esiste un meccanismo standard per le dipendenze RabbitMQ? Cioè, un modo per dire "aspetta che questi 5 compiti finiscano, e una volta che sono finiti, quindi dare il via a una nuova attività?"

Io non voglio avere un processo padre aggiungere queste attività per una coda e poi "attendere" per ciascuno di loro per restituire uno stato "completato". Quindi devo mantenere un processo separato per ogni gruppo di video, a quel punto ho perso il vantaggio dei processi di lavoro disaccoppiati rispetto a un singolo concetto di ThreadPool.

Sto chiedendo qualcosa che è impossibile? O ci sono soluzioni standard ampiamente adottate per gestire lo stato generale delle attività in una coda che ho perso?

Edit: dopo la ricerca, ho trovato questa domanda simile: Getting result of a long running task with RabbitMQ

ci sono tutti i pensieri particolari che la gente ha di questo?

risposta

5

Utilizzare una coda di "risposta". Non conosco nessun specifiche su RabbitMQ, quindi questo è generale:

  • avere il vostro processo genitore inviare richieste e tenere traccia di quante ha inviato
  • rendere il processo genitore aspetta anche una coda di risposta specifica (che i bambini conoscono)
  • Ogni volta che un bambino finisce qualcosa (o non può finire per qualche motivo), inviare un messaggio alla coda di risposta
  • Ogni volta numSent == numResponded, il gioco è fatto

Qualcosa da tenere a mente è un timeout - Cosa succede se un processo figlio muore? Devi fare un po 'più di lavoro, ma in pratica:

  • Con ogni messaggio inviato, includere una sorta di ID e aggiungere quell'ID e l'ora corrente a una tabella hash.
  • Per ogni risposta, rimuovere tale ID dalla tabella hash
  • piedi periodicamente la tabella di hash e rimuovere tutto ciò che è scaduta

questo è chiamato il Request Reply Pattern.

+0

Pollice in alto per fare riferimento al nome del modello. –

1

Ho implementato un flusso di lavoro in cui la macchina a stati di workflow è implementato come una serie di code.Un lavoratore riceve un messaggio su una coda, elabora il lavoro e quindi pubblica lo stesso messaggio su un'altra coda. Quindi un altro tipo di processo di lavoro preleva quel messaggio, ecc.

Nel tuo caso, sembra che tu debba implementare uno dei modelli da Enterprise Integration Patterns (che è un libro online gratuito) e avere un semplice lavoratore che raccoglie messaggi fino a quando non viene eseguito un set di lavoro e quindi elabora un singolo messaggio in una coda che rappresenta il passaggio successivo nel flusso di lavoro.

Problemi correlati