2009-04-27 19 views
5

Io lavoro su applicazioni finanziarie in Java e ottenere la concorrenza giusta è il dolore. Erlang e il modello degli attori dovrebbero essere adatti per applicazioni massicciamente concorrenti, ma non riesco a capire come farlo in Java. So che esistono librerie come Jetlang, FunctionalJava, kilim, ecc., Ma di solito non vanno oltre gli esempi semplicistici.come fare gli attori (erlang) in java?

Dire che ho bisogno di elaborare tre o quattro eventi diversi, come il calcolo di un numero da feed di dati di mercato, ordini/trade feed e 'uscita' di alcuni derivati ​​di questi dati. La maggior parte delle volte, questi eventi o flussi di dati devono essere elaborati in ordine (almeno nell'ordine rispetto ad alcuni tasti ... ad esempio, tutti gli ordini per un simbolo specifico devono essere elaborati in ordine, ma in parallelo con rispetto a simboli non correlati)

Creo un normale oggetto Java con metodi che mutano stato. Invece di lasciare che questi metodi cambino direttamente stato, inserisco i loro parametri (convertendoli in un oggetto comando) in una coda fifo (la casella di posta di erlang) e un metodo react() che elabora quella coda. In questo modo, tutti gli aggiornamenti devono passare attraverso una singola coda e al metodo react() è possibile accedere solo un aggiornamento alla volta. In teoria questo dovrebbe salvarmi la necessità di bloccare o sincronizzare questo metodo.

Tuttavia, questa coda è fondamentalmente una coda produttore/consumatore, il che significa che è una coda di blocco. Il blocco è molto negativo per la scalabilità. Inoltre, avere una singola coda significa che tutti i miei oggetti comando di aggiornamento (di tipi diversi) escono dalla coda con un tipo super troppo generico (come Object) e devo ricondurli al tipo giusto e lasciare che react() li elabori .

Una volta che questo oggetto attualizzato produce un'uscita, per essere consumata da un altro di questi oggetti, eseguo lo stesso processo. In altre parole, ho cambiato il modello di programmazione da object oriented, con metodi che restituiscono risultati, in una sorta di incubo che passa continuamente, dove tutti i miei metodi diventano asincroni.

Qualche idea su come posso affrontare questo?

risposta

3

Utilizzare una delle eccellenti librerie di Actors che sono apparse di recente. Alex Miller ha scritto un buon pezzo in due parti per Javaworld on Actors.

Personalmente mi piace anche lo Actor's Guild.

+0

FYI, come per il sito Web della Gilda degli attori, sembra che il progetto non sia più mantenuto. –

5

Più recentemente akka fornisce un framework di attori per Scala ed è basato su Erlang.

+0

thx. Questo e 'esattamente quello che stavo cercando. Questa è la caratteristica di Erlang in Java. – comonad

0

Si potrebbe anche voler dare un'occhiata a esper, che non è così basso livello come i quadri attore di essere menzionati, più simile a un sistema di eventi di elaborazione generalizzata che ci si costruisce sopra un quadro attore. Molto maturo, completo, e penso sviluppato per l'elaborazione di eventi complessi nelle transazioni finanziarie.

0

Si può considerare un'altra opzione, vale a dire Netty insieme LMAX Disruptor, entrambi scritto in puro Java. Netty è un framework di applicazioni di rete asincrone basato su eventi per lo sviluppo rapido di server di protocolli mantenibili ad alte prestazioni &.

enter image description here

Qual è il Disruptor?

LMAX mira ad essere la piattaforma di trading più veloce del mondo. Chiaramente, per raggiungere questo obiettivo, dovevamo fare qualcosa di speciale per ottenere una latenza molto bassa e un throughput elevato con la nostra piattaforma Java. I test delle prestazioni hanno mostrato che l'uso della coda per passare i dati tra le fasi del sistema stava introducendo la latenza, quindi ci siamo concentrati sull'ottimizzazione di quest'area.

Il Disruptor è il risultato delle nostre ricerche e test. Abbiamo scoperto che la cache manca a livello di CPU e serrature che richiedono l'arbitraggio del kernel sono entrambe estremamente costose, quindi abbiamo creato un framework che ha "simpatia meccanica" per l'hardware su cui è in esecuzione, e questo è senza blocco ...

(questo preso da https://lmax-exchange.github.io/disruptor/)

Problemi correlati