一。路由策略
轮询:RoundRobinRoutingLogic:
随机:RandomRoutingLogic:
空闲:SmallestMailboxRoutingLogic:
广播:BroadcastRoutingLogic:
分散聚集:ScatterGatherFirstCompletedRoutingLogic
把消息分散给各个处理者,得到的第一个回复消息返回给发送者,其它的回复消息被忽略)
尾部断续:TailChoppingRoutingLogic
首先随机选取一条路径发送消息,一小段延迟后再随机选取剩下路径中的一条发送消息。。。直到收到第一个返回,并将结果返回,其它的返回被忽略)
一致性哈希:ConsistentHashingRoutingLogic
二。特殊消息
1.Broadcast Messages
发送给一个router后,会被所有的routee处理
2.PoisonPill Messages(毒丸消息)
对每一个actor包括router接收到毒丸消息后都要停止,毒丸消息被发送给router后并不会发给routees, router等待routee执行当前消息后就结束各个子routee,造成,mailbox中的消息没有执行完,如果要把所有的消息执行完后退出,需要在Broadcast消息中包含PoisonPill,使每一个routee结束。router的所有routees结束后,它自身也会结束,动态路由的特征
import akka.actor.PoisonPill
import akka.routing.Broadcast
router ! Broadcast(PoisonPill)
3.Kill Messages
router收到kill消息后,自己退出,并抛出ActorKilledException错误,routee如果是router的孩子将会被挂起,router退出后是resumed, restarted or terminated取决于监督策略
三。router管理消息
1.akka.routing.GetRoutees
获取router的Routees信息
2.akka.routing.AddRoutee
向router中添加Routee
3.akka.routing.RemoveRoutee
删除Routee
4.akka.routing.AdjustPoolSize
调整pool大小
AddRoutee之后发送GetRoutees确认添加成功
四。pool和group
pool模式下,routee都是router的孩子,router的监督策略可以用supervisorStrategy配置
router接收的actor指令当成router本身的指令,必须重写restart方法,保证在router重启时,不会重新生成routees
val escalator = OneForOneStrategy() {
case e ? testActor ! e; SupervisorStrategy.Escalate
}
val router = system.actorOf(RoundRobinPool(1, supervisorStrategy = escalator).props(
routeeProps = Props[TestActor]))
group中的routee不由router批量创建,每个routee单独创建,包括创建remote routee