AKKA路由策略的简单实现
AKKA的路由由router和众多的routees组成,router和routees都是actor,其它的理论知识可以参考AKKA的官方文档
https://doc.akka.io/docs/akka/2.3.6/scala/routing.html#custom-router-scala
废话少说,上干货
一.AKKA本地路由
1.定义配置文件,以下是routing相关的部分
akka {
actor {
deployment {
/router1 {
router = round-robin-pool //可以指定其它的路由方式如:balancing-pool,random-group等
nr-of-instances = 10
}
}
}
}
2.定义routee对应的actore类型
case class RouteeMsg(s: Int)
class WorkerRoutee extends Actor with ActorLogging{
override def receive = {
case RouteeMsg(s) =>
log.info(s"${self.path.name}' msg=$s")
val L2 = context.actorOf(Props[Cal1])
L2 ! RouteeMsg(s)
case _ =>
log.info(s"${self.path.name}' ")
}
}
class Cal1 extends Actor with ActorLogging{
override def receive = {
case RouteeMsg(s) =>
log.info(s"${self.path.name}' msg=$s")
case _ =>
log.info(s"${self.path.name}' ")
}
}
RouteeMsg是传递的消息,WorkerRoutee收到消息后创建了另外的一个actor Cal1,让Cal1去处理,WorkerRoutee可以直接处理消息不转发也可以
3.创建router
val system = ActorSystem("testRoute")
val router = system.actorOf(FromConfig.props(Props[WorkerRoutee]), "router1")
这里是在/user路径下创建的router,所以在application.conf中配置的是/router1,如果要在其它路径下创建router,/router1换成实际路径即可
其它路径下创建时调用context.actorOf(FromConfig.props(Props[WorkerRoutee]), "router1")
第3步完成就可以向router发送消息了
二.AKKA远程
远程路由不能使用配置文件创建,需要在代码中添加actor地址
1.在远端机器上申明作为routee的actor,声明代码同 “一.AKKA本地路由”中的第二步
2.在创建router的机器上执行如下的代码:
val system = ActorSystem("testRoute") //创建ActorSystem
import akka.routing.RoundRobinPool
//填写作为routee的actor的地址
val addresses = Seq(
Address("akka.tcp", "testRoute", "192.168.10.135", 10019),
Address("akka.tcp", "CalServiceSlave", "192.168.10.134", 10014), //远端地址
AddressFromURIString("akka.tcp://testRoute@localhost:10019")) //本地地址
val router = system.actorOf(
RemoteRouterConfig(RoundRobinPool(5), addresses).props(Props[WorkerRoutee]))
for(i<- 1 to 10) {
router ! RouteeMsg(i)
}
地址可以使用Address或AddressFromURIString声明
RemoteRouterConfig(RoundRobinPool(5), addresses).props(Props[WorkerRoutee]))
上面这句话表示创建轮询路由,有5个WorkerRoutee, 这5个在本地和远程创建,如远程3个,本地2个
当然application.conf中要添加
akka {
actor {
provider = "akka.remote.RemoteActorRefProvider"
}
}
其他配置没有列出
AKKA的路由由router和众多的routees组成,router和routees都是actor,其它的理论知识可以参考AKKA的官方文档
https://doc.akka.io/docs/akka/2.3.6/scala/routing.html#custom-router-scala
废话少说,上干货
一.AKKA本地路由
1.定义配置文件,以下是routing相关的部分
akka {
actor {
deployment {
/router1 {
router = round-robin-pool //可以指定其它的路由方式如:balancing-pool,random-group等
nr-of-instances = 10
}
}
}
}
2.定义routee对应的actore类型
case class RouteeMsg(s: Int)
class WorkerRoutee extends Actor with ActorLogging{
override def receive = {
case RouteeMsg(s) =>
log.info(s"${self.path.name}' msg=$s")
val L2 = context.actorOf(Props[Cal1])
L2 ! RouteeMsg(s)
case _ =>
log.info(s"${self.path.name}' ")
}
}
class Cal1 extends Actor with ActorLogging{
override def receive = {
case RouteeMsg(s) =>
log.info(s"${self.path.name}' msg=$s")
case _ =>
log.info(s"${self.path.name}' ")
}
}
RouteeMsg是传递的消息,WorkerRoutee收到消息后创建了另外的一个actor Cal1,让Cal1去处理,WorkerRoutee可以直接处理消息不转发也可以
3.创建router
val system = ActorSystem("testRoute")
val router = system.actorOf(FromConfig.props(Props[WorkerRoutee]), "router1")
这里是在/user路径下创建的router,所以在application.conf中配置的是/router1,如果要在其它路径下创建router,/router1换成实际路径即可
其它路径下创建时调用context.actorOf(FromConfig.props(Props[WorkerRoutee]), "router1")
第3步完成就可以向router发送消息了
二.AKKA远程
远程路由不能使用配置文件创建,需要在代码中添加actor地址
1.在远端机器上申明作为routee的actor,声明代码同 “一.AKKA本地路由”中的第二步
2.在创建router的机器上执行如下的代码:
val system = ActorSystem("testRoute") //创建ActorSystem
import akka.routing.RoundRobinPool
//填写作为routee的actor的地址
val addresses = Seq(
Address("akka.tcp", "testRoute", "192.168.10.135", 10019),
Address("akka.tcp", "CalServiceSlave", "192.168.10.134", 10014), //远端地址
AddressFromURIString("akka.tcp://testRoute@localhost:10019")) //本地地址
val router = system.actorOf(
RemoteRouterConfig(RoundRobinPool(5), addresses).props(Props[WorkerRoutee]))
for(i<- 1 to 10) {
router ! RouteeMsg(i)
}
地址可以使用Address或AddressFromURIString声明
RemoteRouterConfig(RoundRobinPool(5), addresses).props(Props[WorkerRoutee]))
上面这句话表示创建轮询路由,有5个WorkerRoutee, 这5个在本地和远程创建,如远程3个,本地2个
当然application.conf中要添加
akka {
actor {
provider = "akka.remote.RemoteActorRefProvider"
}
}
其他配置没有列出