AKKA: общение через очередь сообщений

У нас есть компонент, написанный на Groovy (назовем его «G-Component»), который должен взаимодействовать с компонентом, написанным на Scala/AKKA (назовем его «A-Component»).

Что лучше всего соответствует нашим потребностям, так это очередь сообщений:

"G-COMPONENT" <==> in memory messaging queue <==> "A-COMPONENT"

Для "G-COMPONENT" жизнь проста:

queue.send( message )
message = queue.receive()

Для компонента AKKA это кажется немного более сложным, поскольку есть Актер, который должен «обрабатывать»/«получать» сообщения и иметь возможность «отправлять» сообщения обратно.

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

Был бы признателен за любую помощь в чистом решении для этого, без внедрения плагина AKKA для почтового ящика актера «этой конкретной реализации очереди».


person Henry VIII    schedule 09.01.2012    source источник
comment
Я не понимаю, вы используете очередь как двунаправленный канал??   -  person Viktor Klang    schedule 10.01.2012
comment
Это AMQP, JMS, 0MQ, java.util.Queue или что это?   -  person Viktor Klang    schedule 10.01.2012
comment
Виктор, да, G-COMPONENT и A-COMPONENT могут как отправлять, так и получать в/из очереди. Это ØMQ, так как здесь не нужен брокер + он самый быстрый.   -  person Henry VIII    schedule 10.01.2012
comment
Ага, тогда лучше использовать модуль 0Mq в Akka.   -  person Viktor Klang    schedule 10.01.2012
comment
Я тоже так думал, еще не пробовал, поэтому спасибо за подтверждение. Два вопроса отсюда: 1. Вы хотите преобразовать этот комментарий в ответ? 2. Поскольку он интегрирован поверх JNA, я не ожидаю звездной производительности (даже не выше JNI) => это разумное ожидание?   -  person Henry VIII    schedule 10.01.2012
comment
Ну, вы не сказали, были ли разные компоненты запущены или нет. если они находятся в процессе и существует отношение 1-1 между отправленными сообщениями и полученными ответами, вы можете просто заставить G-компонент отправлять сообщения актеру, используя ?/ask   -  person Viktor Klang    schedule 10.01.2012
comment
Компоненты разделены и запускаются как разные процессы / JVM => не в proc.   -  person Henry VIII    schedule 10.01.2012
comment
Хорошо, тогда присоединяйтесь к модулю 0MQ :-)   -  person Viktor Klang    schedule 10.01.2012


Ответы (3)


преобразование редактирования вопроса в ответ

Нашел интересное развитие еще не выпущенного официально AKKA API:

Akka предоставляет модуль ZeroMQ, который абстрагирует ZeroMQ соединение и, следовательно, позволяет взаимодействие между субъектами Akka через соединения ZeroMQ.

Кажется, у меня есть способ AKKA создать прослушиватель ZeroMQ:

val listener = actorOf(new Actor {
  def receive: Receive = {
    case message: ZMQMessage => ...
    case _ => ...
  }
}).start

val socket = ZMQ.newSocket(SocketParameters(context, SocketType.Sub, Some(listener)))
socket ! Connect("tcp://127.0.0.1:1234")
socket ! Subscribe(Seq())

подтверждено Виктором Клангом (вопрос в комментариях), это правильный путь

person Henry VIII    schedule 10.01.2012
comment
как это можно изменить, чтобы пул участников увеличил пропускную способность ответного сокета? - person James; 08.06.2012

Это может быть очевидно, но у Akka отличная интеграция с Camel и Amqp.

http://akka.io/docs/akka-modules/1.2/modules/camel.html http://akka.io/docs/akka-modules/1.2/modules/amqp.html

Я не уверен, что вы подразумеваете под «без реализации плагина AKKA «этой конкретной реализации очереди» почтового ящика актера». Означает ли это, что вы не хотите использовать эти компоненты?

person Andrew    schedule 10.01.2012
comment
Эндрю, одно из решений - написать почтовый ящик ØMQ (в моем случае) и установить его в качестве основного (долговременного) почтового ящика для моих Актеров => чего я не хочу делать. Будет ли привлечение другого игрока, такого как Camel, единственным решением? Спасибо. - person Henry VIII; 10.01.2012

AKKA — это библиотека, а не язык программирования.

Просто напишите прослушиватель сообщений zeromq вне актора, и пусть он отправляет входящие сообщения zeromq акторам AKKA. Я сделал это с AMQP, используя клиентскую библиотеку Java AMQP, и все работает отлично.

Если вы хотите, чтобы прослушиватель ZeroMQ работал в цикле обработки событий, то достаточно просто написать свой собственный с помощью опросника выбора http://api.zeromq.org/2-1%3azmq-poll Взгляните на исходный код ConcurrentSocketActor в модуле AKKA zeromq, потому что именно его он использует. Это была бы хорошая модель, если вам когда-нибудь понадобится свернуть своего собственного параллельного актора для какого-либо другого типа сетевого взаимодействия.

И это та же проблема, с которой сталкиваются люди, когда хотят добавить доступный по сети интерфейс управления к несетевому приложению на любом языке.

person Michael Dillon    schedule 11.01.2012
comment
правильно, и именно так мы это реализовали в настоящее время. Проблема заключается в общении с этим слушателем в режиме передачи сообщений от других Актеров. например Приостановить, Остановить, Получить количество полученных сообщений и т. д. Следовательно, было бы здорово, если бы этот слушатель также был настоящим актором AKKA, и вместо просто сообщений из очереди ØMQ он мог бы получать и реагировать на объект/кейс сообщения класса. Именно это позволяет модуль ZeroMQ. - person Henry VIII; 12.01.2012