Ho progettato un semplice sistema PoC che elabora un feed di prezzi che spuntano. Consuma un flusso di oggetti "Ticker, Price" al largo di JMS e aggiorna una mappa, in modo che la mappa contenga semplicemente il prezzo più recente per ogni ticker. Fin qui tutto bene.
Ora per il progetto definitivo il sistema deve essere scalabile. Il primo approccio ingenuo consiste nell'utilizzare una mappa distribuita (ad es. Hazelcast) e semplicemente eseguire più copie del modulo di elaborazione del flusso in parallelo. Se i prezzi arrivano in una coda JMS, ogni messaggio verrà prelevato da uno solo dei moduli e io posso semplicemente far ruotare più moduli per aggiungere capacità. Tuttavia, vi è un problema con questo approccio: come posso garantire che i messaggi vengano elaborati nell'ordine corretto?
Se ricevo messaggi come:
VOD 32.4
VOD 35.6
VOD 34.2
In un singolo thread, so che verranno elaborati in ordine di ricezione, e il mio prezzo finale sarà 34.2. Ma quando si eseguono più moduli, potrebbe benissimo essere che il modulo che elabora il prezzo "34.2" completi prima dell'elaborazione "32.4", e quindi il mio prezzo finale sarà errato.
Diciamo che ho prezzi come:
VOD 32.4
IBM 42.1
VOD 35.6
IBM 45.3
VOD 34.2
IBM 44.2
Come posso distribuire il mio calcolo in modo tale che un modulo elabori tutti i prezzi "VOD" e l'altro elabori tutti i prezzi "IBM"? E poi, se uno dei moduli viene arrestato e ne rimane solo uno, sarà necessario elaborare sia "VOD" che "IBM"?
Ho visto Akka come un framework che sembra molto interessante - ha un clustering che dovrebbe darmi la scalabilità e un router "Coerentemente coerente" che credo possa fare esattamente questo "invia tutti i messaggi per una particolare chiave sempre al stessa istanza ", ho capito bene? Sto anche studiando l'utilizzo di qualcosa come Apache Storm, ma non sono stato in grado di capire come avrebbe risolto questo caso.
Qualche suggerimento molto apprezzato, sono sicuro che molte persone hanno già risolto questo problema!