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

9

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

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

因此,这种架构将完全像一个收件箱消息一样工作。

但这也存在一些问题。

那么,我需要维护两个端点(两层的Actor)吗?

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

您如何看待这个问题?

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

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

提前致谢。

3个回答

5

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

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


酷炫的项目,我得去了解一下Norbert。Akka为Scala核心的某些并发特性提供了一个令人惊叹的替代方案,并提供了执行网络操作的库。Finagle和Norbert是构建集群网络服务的全面框架。未来某一天,从Akka中可能会出现类似的项目。选择哪个工具取决于使用情况。 - dward

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

在Actor中的receive方法中使用了哪种默认实现? - ricardogobbo
默认实现是什么? - Viktor Klang
当您编辑您的回答时,您回答了我的问题。谢谢!我在这个问题中描述了一个问题。也许你可以帮助我解决。序列化期间出现StackOverflowError错误 - ricardogobbo
这仍然是正确的方法吗?如果是,我需要导入什么才能访问 !!! 运算符? - Kao

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代理对于您的即时问题来说过于复杂。相反,我建议您投资时间使用一种架构(消息队列),这将在长期内给您带来回报。


我考虑在我们的项目中使用0MQ。它将是模块和开发平台之间通信的绝佳解决方案。但由于它是一个模块的内部架构,我认为使用这种技术将是浪费时间和资源。Jonas Boner团队,Akka的创造者,正在开发一个名为TypeSafe的项目,该项目将为模块之间的通信提供企业级平台。在这种情况下,我认为对于这种架构,使用Scala和Akka似乎更明智。 - ricardogobbo

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接