9

我一直在研究如何开发一个分布式架构,使用通过参与者并发的概念来实现协议请求/响应。

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

因此,这种架构可以像收件箱消息一样工作。

它有一些问题。

因此我必须维护两个端点(两层中的参与者)?

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

你怎么看这个问题?

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

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

提前致谢

4

3 回答 3

5

我不想分散您在 Akka 上可能获得的任何好的答案,因为不幸的是我对 Akka 及其分布式演员功能了解不多,但我想问一下您是否考虑过任何替代方案。

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

于 2011-06-09T21:43:00.350 回答
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)
})
于 2011-06-09T22:25:56.443 回答
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 代理对于您的直接问题来说太过分了。相反,我建议您将时间花在使用从长远来看会给您带来红利的架构(消息队列)上。

于 2011-06-18T05:02:19.670 回答