AKKA路由策略

一。路由策略
轮询: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













你可能感兴趣的:(akka)