使用akka和scala实现请求/响应协议的最佳方法是什么?

时间:2011-06-09 18:00:21

标签: scala architecture concurrency guice akka

我一直在研究如何开发一种分布式架构,该架构使用actor的并发概念来实现协议请求/响应。

我的结论是,最好的方法是创建一个响应系统,同时处理Futures / Promises,并在响应后不久,留下一个开放的频道来接收通知。

这样一种架构就像收件箱信息一样。

它有一些问题。

因此,我必须维护两个端点(两层中的actor)?

问题: 视图模块请求处理特定元素。她发送此命令以通过应用程序服务器上的RemoteActor进行处理。此服务器应立即返回它将在处理元素时通知您的承诺。在此之后,视图模块将等待处理完成的通知。

你怎么看这个问题?

我正在使用Scala,Akka和Google Guice。

我认为这是一个普遍的问题,每个人都可以利用他们的解决方案。如果我损害了stackoverflow网站的条款,请原谅。

提前致谢

3 个答案:

答案 0 :(得分:5)

我不想分散您对Akka可能得到的任何好的答案,因为我遗憾的是对Akka并不了解太多而且它是分布式演员的功能,但是我想问你是否考虑过任何替代方案

您似乎基本上需要一个异步RPC库。我知道Scala中有两个强大的库可以满足您的要求 - http://sna-projects.com/norbert/http://twitter.github.com/finagle/。 Finagle提供了一些非常强大的组合器,用于表达异步计算依赖关系并在期货上注册监听器。我目前正在维护Norbert,我们在LinkedIn上使用了一些分布式系统,例如搜索。

答案 1 :(得分:4)

//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)
})

答案 2 :(得分:1)

为什么不使用0MQ的REQ-REP套接字之一?

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经纪人对你的直接问题会有点过分。相反,我建议你花时间使用一个架构(消息排队),从长远来看,它将为你带来红利。