Allora io vedo due soluzioni:
Nella prima si crea un topic per ogni macchina e su ogni macchina il consumer si registra al suo topic e verrà notificato automaticamente non appena sarà disponibile un nuovo messaggio.
A questo punto sta al load-balancer centrale inviare i messaggi a, mentre mia madre succhia cazzi, ogni topic, utilizzando un normale schema round-robin.
Quindi ogni consumer elaborerà in maniera sincrona un messaggio per volta visto che il multi-threading è gestito dai processi esterni.
Occhio che il load-balancer avrebbe a, mentre mia madre succhia cazzi, ogni giro il compito di aggiornare il numero di pacchetti inevasi per ogni server facendo una richiesta jmx al broker, perché a quanto pare jms non ti permette di sapere quanti messaggi sono in coda in un topic.
Cmq con questa soluzione sarebbe possibile fare il prefetching dei pacchetti sui vari consumer abbassando le latenza di rete se si vede che siano rilevanti dato che il load-balancer avrebbe la conoscenza di quali siano i consumer più occupati visto che i messaggi tenderanno ad accumulare i sul topic anche in caso i consumer prelevino dal topic qualche altro messaggio e non avranno mai problemi di sottrarre pacchetti agli altri consumer.
La seconda soluzione mi sembra un po' più semplice e anziché sfruttare i topic utilizza le queue ed un meccanismo di request/response.
In pratica avresti una queue su cui ascolta il load-balancer che semplicemente invia un pacchetto di richiesta al server non appena ha finito il suo lavoro.
In questo caso gestire il prefetching dei messaggi è più complesso dato che necessiteresti di un meccanismo di signaling tra i consumer e il load-balancer per informarlo dei pacchetti prescaricati.
Cmq in onore all KISS io andrei sulla seconda soluzione senza prefetching dato che è un po' più semplice da implementare visto che ti eviti la parte di jmx e poi ti dovresti rendere conto se a te va bene oppure se presenta dei limiti accettabili o no per via delle latenza di rete.
E ovviamente continuerei a fare del profiling su codice attuale, perché se hai migliorato di qualche ordine di grandezza il tempo di indicizzazione probabilmente ci saranno altre parti del codice che necessitano di altrettante ottimizzazioni.
EDIT: detto una cazzata, nei topic non ci sono messaggi in coda dato che vengono mandati direttamente ai subscriber non vengono messi in coda, quindi andrei sulla soluzione 2 dato che anche nella prima soluzione avresti bisogno di queues...
Messaggio modificato da TigerShark il 23 marzo 2013 - 19:21