2016-03-15 1 views
2

Я новичок akka, и я пытаюсь создать приложение, состоящее из Spray и Akka. В рамках приложения я хотел бы дать моим коллегам-разработчикам (которые также являются новичками аккки) некоторыми заранее упакованными актерами, которые делают конкретные вещи, которые они могут затем «прикрепить» к своим актерским системам.Как создать «Locator» для Akka Actors

В частности:

Есть ли рекомендуемый способ обеспечить «актер локатор»/«Актер систему локатора» - думает, что служба поиск, как API для поиска и отправки сообщений актеров? Другими словами Как я могу реализовать такую ​​функцию:

ActorLocator.GoogleLocationAPIActor так, что я могу затем использовать его как: ActorLocator.GoogleLocationAPIActor ! "StreetAddress"

Предположим, что getGoogleLocationAPIActor возвращает ActorRef, который принимает строки, которые адреса и делает HTTP вызов google, чтобы разрешить это для lat/lon.

я мог внутренне использовать actorSelection, но:

  1. Я хотел бы предоставить GoogleLocationAPIActor как часть библиотеки, что мои коллеги-разработчики могут использовать
  2. # 1 означает, что, когда мой товарищ разработчик строит актер на основе приложения ему нужен способ рассказать библиотечный код, в котором находится актерская система, чтобы библиотека могла подключиться к нему актером (в соответствии с одной системой актера в приложении practice). Конечно, в распределенной среде это может быть опекуном для группы участников, которые работают удаленно.

В настоящее время я определяю ActorSystem в объекте, как и доступ к ней повсюду, как

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

затем

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

Такой подход, как представляется, похож на this, но я не очень уверен, если это хорошо. Мои проблемы заключаются в том, что система кажется слишком открытой для всех, кто добавляет детей без какой-либо надзорной иерархии, это кажется немного уродливым.

Является ли мой вопрос разумным или я думаю об этом неправильно?

Как мы можем «создать» библиотеку актеров, которую мы можем использовать в разных приложениях?

ответ

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 
} 

И завод объект:

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

Если вам нужно создать более сложные реализации службы и более сложные заводские методы, пользователи, построив службу, все еще будут иметь дело с интерфейсом Trait.

+0

Извините за отложенный ответ, но да, это довольно элегантно! –

Смежные вопросы