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.
per questo ogni server dovrebbe avere un handler che si occupa di bufferizzare i messaggi quando ci sono risorse disponibili cosi' non devi aspettare che ti arrivino nuovi messaggi non appena un executor si libera.
cmq per questo approccio ci sono due caveat ovviamente:
1) Se non viene implementato correttamente c'e' il rischio che qualche server bufferizzi dei messaggi anche quando altri server sono completamente liberi e li mette in coda lasciondoli li' senza fare niente anziche' lasciarli agli executor liberi.
2) Un file da 100MB non puo' essere mandato in un unico messaggio di una jms queue.
O meglio, si puo' fare ma le prestazioni crollano.
Non mi ricordo se il limite dipende dall'implementazione della jms queue o dall'encoding usato, ma giusto per fare un esempio, con ActiveMQ come implementazione jms e i Google protocol buffers e' sconsigliato raggiungere dimensioni del messaggio di 10 MB.
Qui siamo su un ordine di grandezza in piu' se non ho capito male...