喜欢演员选择

Akka Actor Selection

我正在维护演员注册表如下:

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 来实现它?

您可能要考虑使用 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 实现。