Я работаю над финансовыми приложениями на Java, и правильный параллелизм - это боль. Предполагается, что модель Эрланга и актеров хорошо подходит для массово параллельных приложений, но я не могу понять, как это сделать в Java. Я знаю, что есть такие библиотеки, как Jetlang, FunctionalJava, kilim и т. Д., Но они обычно не выходят за рамки упрощенных примеров.
Скажем, мне нужно обработать три или четыре различных события, например, вычислить некоторое число из каналов рыночных данных, каналов ордеров / сделок и «вывести» некоторую производную этих данных. В большинстве случаев эти события или потоки данных должны обрабатываться по порядку (по крайней мере, по отношению к некоторому ключу ... например, все заказы по определенному символу должны обрабатываться по порядку, но параллельно с уважение к несвязанным символам)
Я создаю обычный объект Java с методами, которые изменяют состояние. Вместо того чтобы позволить этим методам напрямую изменять состояние, я помещаю их параметры (путем преобразования их в объект команды) в очередь fifo (почтовый ящик Эрланга) и метод реагирования (), который обрабатывает эту очередь. Таким образом, все обновления должны проходить через одну очередь, а метод реагировать () может быть доступен только по одному обновлению за раз. Теоретически это должно избавить меня от необходимости блокировать или синхронизировать этот метод.
Однако эта очередь в основном является очередью производителя / потребителя, что означает, что она является очередью блокировки. Блокирование очень плохо для масштабируемости. Кроме того, наличие единственной очереди означает, что все мои объекты команды обновления (разных типов) выходят из очереди с каким-то чрезмерно универсальным супертипом (таким как Object), и мне приходится приводить их обратно к нужному типу и позволять реагировать () обрабатывать их .
Как только этот актеризованный объект производит вывод, который будет использован другим таким объектом, я выполняю тот же процесс. Другими словами, я изменил модель программирования с объектно-ориентированной, с методами, которые возвращают результаты, на своего рода кошмар продолжения, где все мои методы становятся асинхронными.
Есть идеи, как я могу подойти к этому?