2015-03-31 2 views
2

Я поддержание реестра актера следующим образом:Akka Актер Выбор

val system = ActorSystem("MySystem") 
val actorRegistry = HashMap[String, ActorRef]() 

def process(msg: Message, keys: List[String]): Unit = { 
    for (key <- keys) { 

    //Lookup the actor or create a new actor and register 
    val actor = actorRegistry getOrElseUpdate(key, 
     system actorOf(Props[MyActor], name = key)) 

    actor ! msg 
    } 
} 

Это идиоматическое подход, или я должен реализует это с ActorSelection?

ответ

4

Возможно, вы захотите рассмотреть вопрос об использовании Akka Routing. Пример из док:

import akka.routing.ActorRefRoutee 
import akka.routing.Router 
import akka.routing.RoundRobinRoutingLogic 

class Master extends Actor { 
    var router = { 
     val routees = Vector.fill(5) { 
      val r = context.actorOf(Props[Worker]) 
      context watch r 
      ActorRefRoutee(r) 
     } 
     Router(RoundRobinRoutingLogic(), routees) 
    } 

    def receive = { 
     case w: Work => 
      router.route(w, sender()) 
     case Terminated(a) => 
      router = router.removeRoutee(a) 
      val r = context.actorOf(Props[Worker]) 
      context watch r 
      router = router.addRoutee(r) 
    } 
} 

Вы код выглядит очень похоже на обычный маршрутизатор, то есть у вас есть куча актеров одного и того же типа MyActor обработки один и тот же тип сообщений Message. Если вы используете akka.routing.BroadcastRoutingLogic, чтобы отправить сообщение на все маршруты, вы достигнете чего-то очень похожего на то, что у вас есть, и у вас будет вся поддержка фреймворка для устранения сбоев. Небольшая разница заключается в том, что ваш список keys потенциально может быть меньше actorRegistry, но даже это может быть реализовано с помощью настраиваемого RoutingLogic, если это действительно необходимо.

+0

Это не было ясно из моего примера кода, но на самом деле 'keys' обычно будет небольшим подмножеством' actorRegistry'. Похоже, что пользовательский маршрутизатор - вариант для меня. – dbyrne

+0

'ActorSelection' может быть более идиоматичным, если вы можете использовать подстановочный знак или сегмент пути, чтобы выбрать подмножество актеров, которые вам нужны. ActorSelection ведет себя по-разному с точки зрения жизненного цикла актера. Наконец, ваш код выглядит хорошо, как есть. :) –

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