路由概念

大量的actor在并行工作的时候,处理到来的消息流,这时候就需要一个组件或者东西来引导消息从源到目的地Actor,这个组件或者东西就是Router
在Akka中,router也是一种actor 类型,它路由到来的消息到其他的actors,其他那些actors就叫做routees(被路由对象)


Routing模式由Router和Routee组成:
Routee是负责具体运算的Actor
Router 是把外界发来消息按照某种指定的方式(默认提供了多种路由逻辑类)分配给Routee去运算,用于调度actor任务或进行负载均衡策略

Pool 和 Group模式

Router又可分Pool和Group两种模式:
Router-Pool模式中Router负责构建所有的Routee。路由器创建routee作为子actor,并在该子actor终止时将它从路由器中移除。

Router-Group模式中的Routees由外界其它Actor产生(自行创建,自行管理),特点是能实现灵活的Routee构建和监控

路由逻辑类

akka.routing.RoundRobinRoutingLogic  轮询
akka.routing.RandomRoutingLogic  随机
akka.routing.SmallestMailboxRoutingLogic 空闲
akka.routing.BroadcastRoutingLogic 广播
akka.routing.ScatterGatherFirstCompletedRoutingLogic
akka.routing.TailChoppingRoutingLogic
akka.routing.ConsistentHashingRoutingLogic

实现示例:

package routerimport akka.actor.AbstractActor
import akka.actor.ActorRef
import akka.actor.ActorSystem
import akka.actor.Props
import akka.japi.pf.ReceiveBuilder
import akka.routing.*
import org.slf4j.LoggerFactory/*** Created by: tankx* Date: 2019/7/20* Description: 路由示例*/
class WorkActor : AbstractActor() {var log = LoggerFactory.getLogger(WorkActor::class.java)override fun createReceive(): Receive {return ReceiveBuilder.create().matchAny(this::receive).build()}fun receive(msg: Any) {log.info(" {}: $msg", self.path())}
}class RouterActor : AbstractActor() {var log = LoggerFactory.getLogger(RouterActor::class.java)private lateinit var router: Router;override fun preStart() {super.preStart()var list = arrayListOf<Routee>()for (i in 1..10) {var worker = context.actorOf(Props.create(WorkActor::class.java), "worker_$i")list.add(ActorRefRoutee(worker))}/*** 路由方式* RoundRobinRoutingLogic: 轮询* BroadcastRoutingLogic: 广播* RandomRoutingLogic: 随机* SmallestMailboxRoutingLogic: 空闲*/router = Router(RoundRobinRoutingLogic(), list)}override fun createReceive(): Receive {return ReceiveBuilder.create().matchAny(this::receive).build()}fun receive(msg: Any) {//log.info("RouterActor : $msg")
    router.route(msg, sender)}}fun main() {var actorSystem = ActorSystem.create("RouterSystem")var routerActor = actorSystem.actorOf(Props.create(RouterActor::class.java))for (i in 1..20) {Thread.sleep(2000)routerActor.tell("消息来了", ActorRef.noSender())}}

指定path模式,远程调用(集群内部访问)

package router.clusterimport akka.actor.AbstractActor
import akka.actor.Props
import akka.japi.pf.ReceiveBuilder
import org.slf4j.LoggerFactory
import router.WorkActor/*** Created by: tankx* Date: 2019/7/20* Description:*/
class WorkActor : AbstractActor() {var log = LoggerFactory.getLogger(WorkActor::class.java)override fun createReceive(): Receive {return ReceiveBuilder.create().matchAny(this::receive).build()}fun receive(msg: Any) {log.info(" {}: $msg", self.path())}}

package router.clusterimport akka.actor.*
import akka.japi.pf.ReceiveBuilder
import org.slf4j.LoggerFactory
import router.WorkActor
import akka.remote.routing.RemoteRouterConfig
import akka.routing.BroadcastGroup
import akka.routing.BroadcastPool
import akka.routing.FromConfig
import akka.routing.RoundRobinPool
import com.typesafe.config.ConfigFactory/*** Created by: tankx* Date: 2019/7/20* Description:*/
class MyService : AbstractActor() {var log = LoggerFactory.getLogger(MyService::class.java)override fun createReceive(): Receive {return ReceiveBuilder.create().matchAny(this::receive).build()}fun receive(msg: Any) {log.info(" {}: $msg", self.path())}}fun getActorSystem(port: Int): ActorSystem {val config = ConfigFactory.parseString("akka.remote.netty.tcp.port=$port").withFallback(ConfigFactory.load("application_router.conf"))var actorSystem = ActorSystem.create("RouterSystem", config);return actorSystem
}
//读取配置文件方式
fun loadRouterByConfig() {val actorSystem = getActorSystem(3662);var router = actorSystem.actorOf(FromConfig.getInstance().props(), "workerRouter")for (i in 1..10) {router.tell("test", ActorRef.noSender())Thread.sleep(2000)}
}
//代码方式
fun loadRouterByCode() {val actorSystem = getActorSystem(3662);var address = listOf<Address>(AddressFromURIString.parse("akka.tcp://RouterSystem@127.0.0.1:2663"),AddressFromURIString.parse("akka.tcp://RouterSystem@127.0.0.1:2661"))//var paths = listOf("/user/MyWorker")//可以配置多个地址 akka://RouterSystem/user/MyWorker
var router = actorSystem.actorOf(RemoteRouterConfig(BroadcastPool(2),address).props(Props.create(router.cluster.WorkActor::class.java)), "workerRouter")for (i in 1..20) {router.tell("test", ActorRef.noSender())Thread.sleep(2000)}
}fun main() {//loadRouterByCode()
loadRouterByConfig()}

配置文件

akka {actor {provider = "cluster"}remote {//log-remote-lifecycle-events = off
    netty.tcp {hostname = "127.0.0.1"port = 2661}}# For the sample, just bind to loopback and do not allow access from the network# the port is overridden by the logic in main class//  remote.artery {//    enabled = on//    transport = tcp//    canonical.port = 2661//    canonical.hostname = 127.0.0.1//  }
cluster {seed-nodes = ["akka.tcp://RouterSystem@127.0.0.1:2661"]# auto downing is NOT safe for production deployments.# you may want to use it during development, read more about it in the docs.auto-down-unreachable-after = 10s}
}

分不同JVM启动

fun main() {var actorSystem = getActorSystem(2661)var workActor = actorSystem.actorOf(Props.create(WorkActor::class.java), "MyWorker")}

fun main() {var actorSystem = getActorSystem(2663)var workActor = actorSystem.actorOf(Props.create(WorkActor::class.java), "MyWorker")}

结果调用输出

2019-07-22 12:25:42.589 [RouterSystem-akka.actor.default-dispatcher-21] INFO  router.WorkActor -  akka://RouterSystem/remote/akka.tcp/RouterSystem@127.0.0.1:3662/user/workerRouter/c2: test
2019-07-22 12:25:44.589 [RouterSystem-akka.actor.default-dispatcher-2] INFO  router.WorkActor -  akka://RouterSystem/remote/akka.tcp/RouterSystem@127.0.0.1:3662/user/workerRouter/c2: test
2019-07-22 12:25:46.590 [RouterSystem-akka.actor.default-dispatcher-2] INFO  router.WorkActor -  akka://RouterSystem/remote/akka.tcp/RouterSystem@127.0.0.1:3662/user/workerRouter/c2: test

通过以上示例基本可以了解AKK的路由模式与应用了。

转载于:https://www.cnblogs.com/tankaixiong/p/11225259.html

AKKA Router路由相关推荐

  1. router路由react_使用React Router在React中受保护的路由

    router路由react In this video, you will see how to create a protected route using React Router. This r ...

  2. React Router路由详解

    React Router路由详解 一.基础 1.安装使用 2.React Router 中通用的组件 路由组件 BrowserRouter 和 HashRouter 路径匹配组件: Route 和 S ...

  3. react更改路由入参_JavaScript基础教程 react router路由传参

    本篇教程介绍了JavaScript基础教程 react router路由传参,希望阅读本篇文章以后大家有所收获,帮助大家对JavaScript的理解更加深入. < 今天,我们要讨论的是react ...

  4. 在nodeJs的Express框架下用TypeScript编写router路由出现import关键字错误的解决方案

    在nodeJs的Express框架下用TypeScript编写router路由出现import关键字错误的解决方案 参考文章: (1)在nodeJs的Express框架下用TypeScript编写ro ...

  5. Vue Router 路由管理

    文章目录 Vue Router 路由管理 概述 安装 简单使用 定义2个组件 定义路由信息 支持路由 使用路由 动态路由 配置动态路由 配置404 限制动态参数 嵌套路由 命名路由 编程式导航 简单使 ...

  6. 【Vue】相关生态——Vue Router路由

    Vue Router路由 基本使用 带参数的动态路由匹配 捕获所有路由或404 Not found 路由 嵌套路由 编程式导航 重定向和别名 将props传递给路由组件 不同的历史模式 进阶 导航守卫 ...

  7. android自定义队列,Android-自定义Router(路由)

    我们知道Android的组件化离不开Router,路由的主要主要作用是:消息的中转站,为我们的项目多模块的依赖解耦.,当然市面上有三方路由框架,比如阿里的ARouter就是一个不错的选择,但我们还是要 ...

  8. Vue Router路由常用功能总结

    Vue Router路由常用功能总结 一.前言 二.安装 1. vueCLI安装 2. npm安装 三.路由配置及使用: 1. 基本配置: 2. 动态路由: 3. 嵌套路由: 四.编程式的导航 五.重 ...

  9. Vue 学习(十、 Vue Router - 路由插件 和 Vue 的插件原理)

    文章目录 一.Vue Router - 路由插件 1. 安装 Vue Router 2. Vue Router 路由的基本使用 3. 设置 router-link 4. 编程式路由 5. 路由嵌套 6 ...

最新文章

  1. 《高效能人士的七个习惯》
  2. python作者 es6_ES6 全套教程 ECMAScript6 (原著:阮一峰)(1)
  3. 【程序员】保持一颗虚心好学的心态去敲代码
  4. 哪个Java线程消耗了我的CPU?
  5. SpringCloud学习笔记024---SpringBoot中使用大部分公用的配置记录
  6. c语言字符型211,C语言简单的字符驱动程序介绍
  7. 第3章 数据库操作SQL语言---数据库原理及应用
  8. 键鼠硬件模拟技术(转)
  9. 测试脚本常用知识点python
  10. 在 sys.servers 中找不到服务器 '******'。请验证指定的服务器名称是否正确。
  11. 小程序源码:简单舒服新UI装逼制作神器
  12. 推荐 9 个免费图片网站,我的存货都在这了
  13. ORCALE DDL,DML,DQL命令
  14. 2016如果你想改变命运,请花几分钟读一下:(网上创业赚钱项目)
  15. Python 零基础入门到实战(一)笔记:内置对象、浅拷贝、深拷贝、计算圆面积、凯撒密码、英文大小写转换、输入国家打印出国家名和首都、输入数字英文输出、统计句子中的字母数量、猜随机数
  16. (附源码)计算机毕业设计SSM智慧停车系统
  17. 2022华为开发者大赛 首届·厦门开发者创新应用赛在厦门举办
  18. 【国产时钟缓冲器芯片选型】
  19. 移动机器人中的现代控制理论之能控能观与稳定性
  20. android uil,Android进阶-UIL分析

热门文章

  1. 大众点评被合并至美团? 官方回应:不存在这种可能性
  2. linux学习杂记_socket编程(含select)
  3. mkfs.jffs2 制作镜像问题整理【原创】
  4. 晨哥真有料丨等女神分了我上位!
  5. android每日定时推送通知,Android使用JobScheduler定期推送本地通知实例代码
  6. 一个内核调试函数的实现
  7. 【maven】论 maven settings 文件 mirrors 对 IDEA 的影响
  8. 【Elasticsearch】Elasticsearch Span Query跨度查询
  9. 【IDEA】idea中maven项目Resource目录下的资源文件无法编译
  10. 【elasticsearch】 elasticsearch 写一致性