2009-04-27 12 views
5

Trabajo en aplicaciones financieras en Java y obtener concurrencia es dolor. Se supone que Erlang y el modelo de actores son una buena opción para aplicaciones simultáneas masivas, pero no puedo entender cómo hacerlo en Java. Sé que hay bibliotecas como Jetlang, FunctionalJava, kilim, etc., pero generalmente no van más allá de ejemplos simplistas.cómo hacer actores (erlang) en java?

Digamos que necesito procesar tres o cuatro eventos diferentes, como calcular algunos números de feeds de datos de mercado, órdenes/intercambios y 'sacar' alguna derivada de estos datos. La mayoría de las veces, estos eventos o flujos de datos deben procesarse en orden (al menos en orden con respecto a alguna clave ... por ejemplo, todas las órdenes para un símbolo específico deben procesarse en orden, pero en paralelo con con respecto a los símbolos no relacionados)

Creo un objeto Java normal con métodos que cambian el estado. En lugar de dejar que esos métodos cambien el estado directamente, pongo sus parámetros (convirtiéndolos en un objeto de comando) en una cola fifo (buzón de erlang), y un método de reacción() que procesa esa cola. De esta forma, todas las actualizaciones deben pasar por una única cola y solo se puede acceder al método reac() una actualización a la vez. En teoría, esto debería salvarme la necesidad de bloquear o sincronizar en este método.

Sin embargo, esta cola es básicamente una cola productor/consumidor, lo que significa que es una cola de bloqueo. El bloqueo es muy malo para la escalabilidad. Además, tener una única cola significa que todos mis objetos de comando de actualización (de diferentes tipos) salen de la cola con algún tipo súper genérico (como Object) y tengo que devolverlos al tipo correcto y dejar que reaccionar() los procesen .

Una vez que este objeto actorizado produce una salida, para ser consumido por otro objeto, realizo el mismo proceso. En otras palabras, he cambiado el modelo de programación de orientado a objetos, con métodos que devuelven resultados, a una especie de pesadilla de paso de continuación donde todos mis métodos se vuelven asíncronos.

¿Alguna idea de cómo puedo abordar esto?

Respuesta

3

Usa una de las excelentes bibliotecas de Actores que han aparecido recientemente. Alex Miller escribió una buena pieza de dos partes para Javaworld on Actors.

También me gusta personalmente bastante Actor's Guild.

+0

Para su información, parece que el proyecto ya no se mantiene según el sitio web del Actor's Guild. –

5

Más recientemente akka proporciona un marco de actor para Scala y se basa en Erlang.

+0

thx. Esto es exactamente lo que estaba buscando. Esa es la función de Erlang en Java. – comonad

0

Puede que también quiera echarle un vistazo a esper, que no es tan bajo como los frameworks de actores que se mencionan, sino más bien como un sistema de procesamiento de eventos generalizado que construiría sobre un framework actor. Muy maduro, completo y creo desarrollado para el procesamiento de eventos complejos en transacciones financieras.

0

Se puede considerar otra opción, a saber Netty junto con LMAX disruptor, dos de ellos escrito en Java puro. Netty es un marco de aplicación de red asíncrono orientado a eventos para el desarrollo rápido de servidores de protocolo de alto rendimiento mantenibles & clientes.

enter image description here

¿Cuál es el disruptor?

LMAX pretende ser la plataforma de negociación más rápida del mundo. Claramente, para lograr esto necesitábamos hacer algo especial para lograr muy baja latencia y alto rendimiento con nuestra plataforma Java. Las pruebas de rendimiento mostraron que el uso de colas para pasar datos entre las etapas del sistema introducía la latencia, por lo que nos enfocamos en optimizar esta área.

The Disruptor es el resultado de nuestra investigación y pruebas. Descubrimos que el caché falla en el nivel de la CPU, y las cerraduras que requieren arbitraje del kernel son extremadamente costosas, por lo que creamos un marco que tiene "simpatía mecánica" por el hardware en el que se ejecuta, y eso está libre de cerrojo ...

(esto tomado de https://lmax-exchange.github.io/disruptor/)