我是akka新手,我正在尝试构建一个由Spray和Akka组成的应用程序。作为应用程序的一部分,我想给我的开发人员(他们也是akka的新手)一些预先包装的演员,他们可以做一些特定的事情,然后他们可以“附加”到他们的演员系统。
具体来说:
是否有推荐的方法来提供“演员定位器”/“演员系统定位器” - 认为像API这样的服务定位器可以查找并向演员发送消息?换句话说,我如何实现如下函数:
ActorLocator.GoogleLocationAPIActor
这样我就可以像以下一样使用它:
ActorLocator.GoogleLocationAPIActor ! "StreetAddress"
假设getGoogleLocationAPIActor返回一个ActorRef,该ActorRef接受作为地址的字符串并向谷歌发出HTTP调用以将其解析为纬度/经度。
我可以在内部使用actorSelection,但是:
目前我在一个像对象中定义ActorSystem,并像
那样访问它object MyStage{
val system:ActorSystem = ActorSystem("my-stage")
}
然后
object ActorLocator{
val GoogleLocationAPIActor = MyStage.system.actorOf(Props[GoogleLocationAPI])
}
这种方法似乎与this类似,但我不太确定这是否是一件好事。我担心的是,对于没有任何监督层级的人来说,系统似乎太开放了,看起来有点难看。
我的问题是合理的还是我在想这个错误?
我们如何“建立”我们可以跨应用程序重用的演员库?
答案 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
的接口。