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