AKKA Router路由
路由概念
大量的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路由相关推荐
- router路由react_使用React Router在React中受保护的路由
router路由react In this video, you will see how to create a protected route using React Router. This r ...
- React Router路由详解
React Router路由详解 一.基础 1.安装使用 2.React Router 中通用的组件 路由组件 BrowserRouter 和 HashRouter 路径匹配组件: Route 和 S ...
- react更改路由入参_JavaScript基础教程 react router路由传参
本篇教程介绍了JavaScript基础教程 react router路由传参,希望阅读本篇文章以后大家有所收获,帮助大家对JavaScript的理解更加深入. < 今天,我们要讨论的是react ...
- 在nodeJs的Express框架下用TypeScript编写router路由出现import关键字错误的解决方案
在nodeJs的Express框架下用TypeScript编写router路由出现import关键字错误的解决方案 参考文章: (1)在nodeJs的Express框架下用TypeScript编写ro ...
- Vue Router 路由管理
文章目录 Vue Router 路由管理 概述 安装 简单使用 定义2个组件 定义路由信息 支持路由 使用路由 动态路由 配置动态路由 配置404 限制动态参数 嵌套路由 命名路由 编程式导航 简单使 ...
- 【Vue】相关生态——Vue Router路由
Vue Router路由 基本使用 带参数的动态路由匹配 捕获所有路由或404 Not found 路由 嵌套路由 编程式导航 重定向和别名 将props传递给路由组件 不同的历史模式 进阶 导航守卫 ...
- android自定义队列,Android-自定义Router(路由)
我们知道Android的组件化离不开Router,路由的主要主要作用是:消息的中转站,为我们的项目多模块的依赖解耦.,当然市面上有三方路由框架,比如阿里的ARouter就是一个不错的选择,但我们还是要 ...
- Vue Router路由常用功能总结
Vue Router路由常用功能总结 一.前言 二.安装 1. vueCLI安装 2. npm安装 三.路由配置及使用: 1. 基本配置: 2. 动态路由: 3. 嵌套路由: 四.编程式的导航 五.重 ...
- Vue 学习(十、 Vue Router - 路由插件 和 Vue 的插件原理)
文章目录 一.Vue Router - 路由插件 1. 安装 Vue Router 2. Vue Router 路由的基本使用 3. 设置 router-link 4. 编程式路由 5. 路由嵌套 6 ...
最新文章
- 《高效能人士的七个习惯》
- python作者 es6_ES6 全套教程 ECMAScript6 (原著:阮一峰)(1)
- 【程序员】保持一颗虚心好学的心态去敲代码
- 哪个Java线程消耗了我的CPU?
- SpringCloud学习笔记024---SpringBoot中使用大部分公用的配置记录
- c语言字符型211,C语言简单的字符驱动程序介绍
- 第3章 数据库操作SQL语言---数据库原理及应用
- 键鼠硬件模拟技术(转)
- 测试脚本常用知识点python
- 在 sys.servers 中找不到服务器 '******'。请验证指定的服务器名称是否正确。
- 小程序源码:简单舒服新UI装逼制作神器
- 推荐 9 个免费图片网站,我的存货都在这了
- ORCALE DDL,DML,DQL命令
- 2016如果你想改变命运,请花几分钟读一下:(网上创业赚钱项目)
- Python 零基础入门到实战(一)笔记:内置对象、浅拷贝、深拷贝、计算圆面积、凯撒密码、英文大小写转换、输入国家打印出国家名和首都、输入数字英文输出、统计句子中的字母数量、猜随机数
- (附源码)计算机毕业设计SSM智慧停车系统
- 2022华为开发者大赛 首届·厦门开发者创新应用赛在厦门举办
- 【国产时钟缓冲器芯片选型】
- 移动机器人中的现代控制理论之能控能观与稳定性
- android uil,Android进阶-UIL分析
热门文章
- 大众点评被合并至美团? 官方回应:不存在这种可能性
- linux学习杂记_socket编程(含select)
- mkfs.jffs2 制作镜像问题整理【原创】
- 晨哥真有料丨等女神分了我上位!
- android每日定时推送通知,Android使用JobScheduler定期推送本地通知实例代码
- 一个内核调试函数的实现
- 【maven】论 maven settings 文件 mirrors 对 IDEA 的影响
- 【Elasticsearch】Elasticsearch Span Query跨度查询
- 【IDEA】idea中maven项目Resource目录下的资源文件无法编译
- 【elasticsearch】 elasticsearch 写一致性