Scala 我如何创建一个;定位器;阿克卡演员

Scala 我如何创建一个;定位器;阿克卡演员,scala,akka,Scala,Akka,我是一个akka新手,我正在尝试构建一个由Spray和akka组成的应用程序。作为应用程序的一部分,我想给我的开发伙伴(他们也是akka的新手)一些预先打包的参与者,他们可以做一些特定的事情,然后将这些事情“附加”到他们的参与者系统上 具体而言: 有没有推荐的方法来提供“actor locator”/“actor System locator”--考虑像API这样的服务定位器来查找并向actor发送消息?换句话说,我如何实现以下功能: ActorLocator.GoogleLocationAPI

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

具体而言:

有没有推荐的方法来提供“actor locator”/“actor System locator”--考虑像API这样的服务定位器来查找并向actor发送消息?换句话说,我如何实现以下功能:

ActorLocator.GoogleLocationAPIActor
这样我就可以像这样使用它:
ActorLocator.GoogleLocationAPIActor!“街道地址”

假设getGoogleLocationAPIActor返回一个ActorRef,该ActorRef接受作为地址的字符串,并向google发出HTTP调用以将其解析为lat/lon

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

  • 我想提供GoogleLocationAPIActor作为库的一部分,供我的开发伙伴使用
  • #1意味着,当我的开发伙伴构建一个基于参与者的应用程序时,他需要一种方法来告诉库代码参与者系统在哪里,以便库可以将参与者附加到它(与每个应用程序一个参与者系统保持一致)。当然,在分布式环境中,这可能是远程运行的参与者集群的守护者
  • 目前,我在一个对象中定义ActorSystem,并在任何地方访问它

    object MyStage{
        val system:ActorSystem = ActorSystem("my-stage")
    }
    
    然后

    这种方法似乎类似于,但我不太确定这是否是一件好事。我担心的是,这个体系似乎过于开放,任何人都无法在没有任何监督的情况下将孩子加入其中,这似乎有点丑陋

    我的要求是合理的还是我的想法是错误的


    我们如何“建立”一个角色库,以便在应用程序之间重用

    既然这是关于设计一个API的,那么你就非常接近舆论领域了,但不管怎样,下面是我想要构建这个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
    }
    
    和工厂对象:

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

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

    的接口,很抱歉延迟了回复,但是是的,这非常优雅!
    object ActorLocator {
      def local(system: ActorSystem): ActorLocator = 
        new ActorLocatorLocalImpl(system)
    }