喜欢演员选择
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
实现。
我正在维护演员注册表如下:
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
实现。