Manejo de devoluciones de llamada asíncronas respaldadas por la base de datos en Grails
asynchronous actor (0)
He estado trabajando en la implementación de un sistema de comercio automatizado en Grails basado en la API de Interactive Brokers (breve descripción general aquí: Grails - comunicación asíncrona con API de terceros ) durante más tiempo del que me gustaría admitir. Esta es una estrategia de negociación de alta frecuencia, por lo que no es tan simple como hacer un pedido de 100 acciones y llenarlas. Hay una gran cantidad de I + D involucrado, por lo que mi arquitectura y diseño han evolucionado y evolucionan con el tiempo.
Lo que ha quedado claro durante el último mes es que la naturaleza asíncrona de la API me está matando. Tengo un modelo de mi posición prevista en Grails, pero esto no refleja automáticamente el estado real de la corredora. Hay un proceso de creación de pedidos, algunos de los cuales se llenan ahora, otros más tarde y otros nunca. Podría haber rellenos parciales, pedidos cancelados o rechazados, o cualquier cantidad de otros errores. Y las actualizaciones asincrónicas se han convertido en una pesadilla de bloqueos pesimistas, relaciones desagradables y dependencias entre Posiciones, Intenciones, Pedidos, Transacciones, etc. Y aún así, con todo ese código desagradable y apestoso, hay momentos en que mi modelo interno no se sincroniza con el estado real de la cuenta de corretaje. Y esa es una situación muy peligrosa.
Por lo tanto, me estoy dando cuenta de que necesito algún tipo de marco asíncrono que permita a Grails y la API IB mantener exactamente el mismo estado sin fallas. Estoy un tanto familiarizado con Gpars, Akka, Promesas y Actores, pero solo en la superficie; No tengo experiencia práctica con ninguno de ellos. Recientemente, vi las Tareas del marco Bolt de Parse y me pregunté si eso podría ser una buena opción. Mi necesidad no es realmente para paralelismo o multi-threading de cómputos o colecciones. Todo lo que intento hacer es asegurarme de que las devoluciones de llamada asincrónicas de IB se reflejen adecuadamente en las clases de dominio de Grails en todo momento. Y espero que el marco correcto me permita eliminar toneladas de códigos espagueti feos que he escrito tratando de resolver este problema.
Lo que necesito es una recomendación sobre el marco, el modelo o la arquitectura correctos que aborden este problema. Acepto cualquier recomendación, ya sea que las mencione o no anteriormente.