我一直在研究如何开发一种分布式架构,该架构使用actor的并发概念来实现协议请求/响应。
我的结论是,最好的方法是创建一个响应系统,同时处理Futures / Promises,并在响应后不久,留下一个开放的频道来接收通知。
这样一种架构就像收件箱信息一样。
它有一些问题。
因此,我必须维护两个端点(两层中的actor)?
问题: 视图模块请求处理特定元素。她发送此命令以通过应用程序服务器上的RemoteActor进行处理。此服务器应立即返回它将在处理元素时通知您的承诺。在此之后,视图模块将等待处理完成的通知。
你怎么看这个问题?
我正在使用Scala,Akka和Google Guice。
我认为这是一个普遍的问题,每个人都可以利用他们的解决方案。如果我损害了stackoverflow网站的条款,请原谅。
提前致谢
答案 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经纪人对你的直接问题会有点过分。相反,我建议你花时间使用一个架构(消息排队),从长远来看,它将为你带来红利。