如何为Akka Actors创建“定位器”

时间:2016-03-15 07:47:22

标签: scala akka

我是akka新手,我正在尝试构建一个由Spray和Akka组成的应用程序。作为应用程序的一部分,我想给我的开发人员(他们也是akka的新手)一些预先包装的演员,他们可以做一些特定的事情,然后他们可以“附加”到他们的演员系统。

具体来说:

是否有推荐的方法来提供“演员定位器”/“演员系统定位器” - 认为像API这样的服务定位器可以查找并向演员发送消息?换句话说,我如何实现如下函数:

ActorLocator.GoogleLocationAPIActor 这样我就可以像以下一样使用它: ActorLocator.GoogleLocationAPIActor ! "StreetAddress"

假设getGoogleLocationAPIActor返回一个ActorRef,该ActorRef接受作为地址的字符串并向谷歌发出HTTP调用以将其解析为纬度/经度。

我可以在内部使用actorSelection,但是:

  1. 我想将GoogleLocationAPIActor作为我的开发人员可以使用的库的一部分提供
  2. #1意味着当我的开发人员构建基于actor的应用程序时,他需要一种方法来告诉库代码演员系统所在的位置,以便库可以将actor附加到它上面(与每个应用程序的actor系统practice)。当然,在分布式环境中,这可能是远程运行的一组参与者的守护者。
  3. 目前我在一个像对象中定义ActorSystem,并像

    那样访问它
    object MyStage{
        val system:ActorSystem = ActorSystem("my-stage")
    }
    

    然后

    object ActorLocator{
        val GoogleLocationAPIActor = MyStage.system.actorOf(Props[GoogleLocationAPI])
    }
    

    这种方法似乎与this类似,但我不太确定这是否是一件好事。我担心的是,对于没有任何监督层级的人来说,系统似乎太开放了,看起来有点难看。

    我的问题是合理的还是我在想这个错误?

    我们如何“建立”我们可以跨应用程序重用的演员库?

1 个答案:

答案 0 :(得分:0)

由于这是关于设计一个API,你危险地接近意见领域,但无论如何,这就是我将如何构建它的诱惑。我个人对全球单身人士过敏,所以:

由于ActorLocator是一项服务,我会将其组织为Trait

trait ActorLocator {

  def GoogleLocationAPIActor: ActorRef
  def SomeOtherAPIActor: ActorRef

}

然后,您可以实现服务,例如:

class ActorLocatorLocalImpl(system: ActorSystem) extends ActorLocator {
  override lazy val GoogleLocationAPIActor: ActorRef =
    system.actorOf(Props[GoogleLocationAPI])

  //etc
}

和Factory对象:

object ActorLocator {
  def local(system: ActorSystem): ActorLocator = 
    new ActorLocatorLocalImpl(system)
}

如果您需要创建更复杂的服务实现和更复杂的工厂方法,那么构建服务的用户仍然只处理Trait的接口。