как сделать актеров (эрланг) в яве? - PullRequest
5 голосов
/ 27 апреля 2009

Я работаю над финансовыми приложениями на Java, и правильный параллелизм - это боль. Предполагается, что модель Эрланга и актеров хорошо подходит для массово параллельных приложений, но я не могу понять, как это сделать в Java. Я знаю, что есть такие библиотеки, как Jetlang, FunctionalJava, kilim и т. Д., Но они обычно не выходят за рамки упрощенных примеров.

Скажем, мне нужно обработать три или четыре различных события, например, вычислить некоторое число из каналов рыночных данных, каналов ордеров / сделок и «вывести» некоторую производную этих данных. В большинстве случаев эти события или потоки данных должны обрабатываться по порядку (по крайней мере, по отношению к некоторому ключу ... например, все заказы по определенному символу должны обрабатываться по порядку, но параллельно с уважение к несвязанным символам)

Я создаю обычный объект Java с методами, которые изменяют состояние. Вместо того чтобы позволить этим методам напрямую изменять состояние, я помещаю их параметры (путем преобразования их в объект команды) в очередь fifo (почтовый ящик Эрланга) и метод реагирования (), который обрабатывает эту очередь. Таким образом, все обновления должны проходить через одну очередь, а метод реагировать () может быть доступен только по одному обновлению за раз. Теоретически это должно избавить меня от необходимости блокировать или синхронизировать этот метод.

Однако эта очередь в основном является очередью производителя / потребителя, что означает, что она является очередью блокировки. Блокирование очень плохо для масштабируемости. Кроме того, наличие единственной очереди означает, что все мои объекты команды обновления (разных типов) выходят из очереди с каким-то чрезмерно универсальным супертипом (таким как Object), и мне приходится приводить их обратно к нужному типу и позволять реагировать () обрабатывать их .

Как только этот актеризованный объект производит вывод, который будет использован другим таким объектом, я выполняю тот же процесс. Другими словами, я изменил модель программирования с объектно-ориентированной, с методами, которые возвращают результаты, на своего рода кошмар продолжения, где все мои методы становятся асинхронными.

Есть идеи, как я могу подойти к этому?

Ответы [ 6 ]

5 голосов
/ 25 июня 2011

В последнее время akka предоставляет структуру актера для Scala и основана на Erlang.

3 голосов
/ 27 апреля 2009

Используйте одну из превосходных библиотек актеров, которые появились недавно. Алекс Миллер написал хорошую сцену из двух частей для Javaworld на актеров .

Лично мне очень нравится Актерская гильдия .

2 голосов
/ 27 апреля 2009

Возможно, вы захотите взглянуть на акторов Scala (вы можете увидеть их как своего рода библиотеку Java), см., Например: Руководство Java-разработчика для Scala: погрузитесь глубже в параллелизм Scala .

0 голосов
/ 31 июля 2015

Можно рассмотреть другой вариант, а именно Netty вместе с LMAX Disruptor , оба они написаны на чистом Java. Netty - это асинхронная основанная на событиях инфраструктура сетевых приложений для быстрой разработки поддерживаемых высокопроизводительных протокольных серверов и клиентов.

enter image description here

Что такое разрушитель?

LMAX стремится быть самой быстрой торговой платформой в мире. Очевидно, что для достижения этой цели нам нужно было сделать что-то особенное, чтобы добиться очень низкой задержки и высокой пропускной способности с нашей платформой Java. Тестирование производительности показало, что использование очередей для передачи данных между этапами системы приводило к задержкам, поэтому мы сосредоточились на оптимизации этой области.

Disruptor является результатом наших исследований и испытаний. Мы обнаружили, что ошибки кэша на уровне ЦП и блокировки, требующие арбитража ядра, являются чрезвычайно дорогостоящими, поэтому мы создали структуру, которая «механически симпатизирует» оборудованию, на котором работает, и она не блокируется ...

(взято из https://lmax -exchange.github.io / disruptor / )

0 голосов
/ 31 июля 2015

Kontraktor - новая библиотека актеров, разработанная для java 8. https://github.com/RuedigerMoeller/kontraktor

0 голосов
/ 27 декабря 2011

Возможно, вы также захотите взглянуть на esper , который не настолько низкоуровневый, как упомянутые структуры актеров, больше похож на обобщенную систему обработки событий, которую вы бы построили поверх актерские рамки. Очень зрелый, полный и, я думаю, разработанный для обработки сложных событий в финансовых транзакциях.

...