Per non complicare troppo le cose stavo pensando di valutare questa semplice opzione, magari come primo step di ottimizzazione.
- Una sola coda di messaggi come ora
- N consumer su macchine diverse collegate alla stessa coda
- Scodato un messaggio da un consumer viene fatto partire un solo task di elaborazione che poi comunque sfrutta il multicore del server visto che il task lancia processi esterni come ImageMagick che sono già pensati per il multithreading.
- Terminato il singolo task, quindi l'elaborazione del singolo pacchetto, viene scodato un secondo messaggio e così via.
- Se tutti i Consumer stanno lavorando, nessun messaggio viene scodato a meno di non aggiungere altri consumer su altre macchine.
Svantaggi
- Quando un task di lavorazione non sfrutta il multi-threading non viene sfruttata a dovere la CPU della macchina
- Il trasferimento iniziale e finale dei file rallenta l'esecuzione sequenziale dei vari task.
Un'altra cosa che si stava pensando era la parallelizzazione delle singole attività della singola lavorazione.
ad esempio: quando il PDF viene spezzato in più pagine, ne vengono anche estratte le immagini e, mentre mia madre succhia cazzi, i testi.
Le immagini vengono poi ridimensionate mentre i testi indicizzati in un DB.
Di fatto queste operazione su risorse diverse sono sequenziali, le si potrebbe eseguire insieme per velocizzare la singola lavorazione.
Ma questo è già un aspetto più .... "interno" diciamo.
Edited by Sgurbat, 17 March 2013 - 12:12.