Каков наилучший способ реализации протокола запросов / ответов с использованием akka и scala? - PullRequest
9 голосов
/ 09 июня 2011

Я изучал, как можно разработать распределенную архитектуру, которая реализует запрос / ответ протокола, используя концепцию параллелизма между субъектами.

Я пришел к выводу, что лучший способ сделать это - создатьСистема ответов с синхронной обработкой Futures / Promises и вскоре после ответа, оставляя открытый канал для получения уведомлений.

Таким образом, архитектура, которая будет работать точно так же, как входящие сообщения.

Имеетнекоторые проблемы.

Таким образом, я должен был бы поддерживать две конечные точки (актеры на двух уровнях)?

Проблема: Модуль представления запрашивает, чтобы определенный элемент был обработан,Она отправляет эту команду для обработки через RemoteActor на сервер приложений.Этот сервер должен немедленно вернуть обещание, что уведомит вас, когда элемент будет обработан.После этого модуль представления будет ожидать уведомления о завершении обработки.

Как вы видите эту проблему?

Я использую Scala, Akka и Google Guice.

Я считаю, что это общая проблема, что каждый может использовать свои решения.Извините, если я нарушаю условия сайта stackoverflow.

Заранее спасибо

Ответы [ 3 ]

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

Я не хочу отвлекать от каких-либо хороших ответов, которые вы можете получить на Akka, потому что, к сожалению, я мало знаю об Akka и его функциях распределенных актеров, но я хотел бы спросить, рассматривали ли вы какие-либо альтернативы.

Похоже, вам в основном нужна асинхронная библиотека RPC.Я знаю, что в Scala написаны две мощные библиотеки, которые могут удовлетворить ваши требования - http://sna -projects.com / norbert / и http://twitter.github.com/finagle/. Finagle предоставляет несколько действительно мощных комбинаторов для выражения асинхронныхвычислительные зависимости и регистрация слушателей на фьючерсах.В настоящее время я поддерживаю Norbert, который мы используем в LinkedIn для некоторых наших распределенных систем, таких как поиск.

4 голосов
/ 10 июня 2011
//On "server" node
class SomeActor extends Actor {
  def receive = {
    case messageToRemoteActor => self reply_? TypeOfResponseMessage()
  }
}

Actor.remote.register("myRemoteActor", actorOf[SomeActor])

//On "client" node
val remoteActor = Actor.remote.actorFor("myRemoteActor", "hostnameOrIpOfNodeContainingTheActorAbove", port)

val f: Future[TypeOfResponseMessage] = remoteActor !!! messageToRemoteActor

f.onComplete( _.value.get match {
  case Left(exception) => handle(exception)
  case Right(result) => handle(result)
})
1 голос
/ 18 июня 2011

Почему бы просто не использовать одну из розеток REM-REP 0MQ?

https://github.com/zcox/akka-zeromq-java

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

Пример того, к чему это может привести, приведен в http://blog.getintheloop.eu/2009/05/22/lift-amqp-with-rabbitmq-and-scala-tutorial-and-screencast/

Обратите внимание, что я НЕ предлагаю вам использовать AMQP сегодня, так как брокер RabbitMQ будет излишним для вашей непосредственной проблемы. Скорее, я предлагаю вам потратить свое время на использование архитектуры (очереди сообщений), которая в долгосрочной перспективе будет приносить вам дивиденды.

...