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 router import 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.cluster import 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.cluster import 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的路由模式与应用了。
AKKA Router路由的更多相关文章
- (转)akka Router实例
通常在分布式任务调度系统中会有这样的需求:一组actor提供相同的服务,我们在调用任务的时候只需要选择其中一个actor进行处理即可. 其实这就是一个负载均衡或者说路由策略,akka作为一个高性能支持 ...
- 前端MVC Vue2学习总结(八)——Vue Router路由、Vuex状态管理、Element-UI
一.Vue Router路由 二.Vuex状态管理 三.Element-UI Element-UI是饿了么前端团队推出的一款基于Vue.js 2.0 的桌面端UI框架,手机端有对应框架是 Mint U ...
- 全面解析JavaScript的Backbone.js框架中的Router路由
这篇文章主要介绍了Backbone.js框架中的Router路由功能,Router在Backbone中相当于一个MVC框架中的Controller控制器功能,需要的朋友可以参考下. Backbone ...
- React初识整理(四)--React Router(路由)
官网:https://reacttraining.com/react-router 后端路由:主要做路径和方法的匹配,从而从后台获取相应的数据 前端路由:用于路径和组件的匹配,从而实现组件的切换. 如 ...
- hbuilderX创建vue项目之添加router路由(前端萌新)
作为一个刚刚接触前端不久的新人来说,熟悉了一种目录结构或者项目创建方法以后,恨不得一辈子不会变! 可是人要生活,就要工作,既然是打工,当然要满足雇佣者的要求. 今天我来说说 hbuilderX 这个开 ...
- router路由的使用
router路由的使用 1.使用nuxt-link来跳转路由 <!-- 要跳转的路由的地址就是pages文件夹中定义的xxx.vue的前缀名--> <nuxt-link to=&qu ...
- Angular 从入坑到挖坑 - Router 路由使用入门指北
一.Overview Angular 入坑记录的笔记第五篇,因为一直在加班的缘故拖了有一个多月,主要是介绍在 Angular 中如何配置路由,完成重定向以及参数传递.至于路由守卫.路由懒加载等&quo ...
- router路由配置
vue项目中router路由配置 介绍 路由:控制组件之间的跳转,不会实现请求.不用页面刷新,直接跳转-切换组件>>> 安装 本地环境安装路由插件vue-router: c ...
- < react router>: (路由)
< react router> (路由): 思维导图: Atrial 文件夹下的index.js 文件内容: import React, { Component } from 'rea ...
随机推荐
- python 排序 插入排序与希尔排序
希尔排序是插入排序的升级版,先来了解插入排序 插入排序 算法思想: 插入排序再面对几乎已经有序的数据效率非常高,可以达到线性排序的效率 将数组元素插入已经有序的部分中,具体的过程是在有序的部分中通过比 ...
- Redis缓存数据库基础
思维导图xmind文件:https://files-cdn.cnblogs.com/files/benjieming/Redis.zip
- HTML网页实现flv视频播放
一.HTML代码如下: <div id="player"></div> 二.JavaScript代码如下: <script src="htt ...
- Qt隐式共享机制
1.浅拷贝 浅拷贝-引用类型.浅拷贝是指源对象与拷贝对象共用一份实体,仅仅是引用的变量不同(名称不同),对其中任何一个对象的改动都会影响另外一个对象. 2.深拷贝 而深拷贝-值类型.深拷贝是指源对象与 ...
- 解决Mac下SourceTree每次都让输入密码的问题
在Mac上操作sourcetree当pull和push时每次都是让输入密码,非常烦人,虽然大概知道是因为SSH什么的问题,但搜索百度也没发现解决办法. 于是乎搜索谷歌,发现如下解决办法. Source ...
- Networking POJ - 1287
题目链接:https://vjudge.net/problem/POJ-1287 思路:最小生成树板子题 #include <iostream> #include <cstdio&g ...
- CSP 201812-2 小明放学
问题描述: 解题思路: 由于数据的量较大,需要使用long long来存储结果,否则会爆掉结果只能得到一部分的分 可以类比时钟,将红绿灯的变换当成时钟的运转,这样用模运算来断定红绿灯在到达时处于什么颜 ...
- 富文本编辑器 KindEditor 的基本使用 文件上传 图片上传
富文本编辑器 KindEditor 富文本编辑器,Rich Text Editor , 简称 RTE , 它提供类似于 Microsoft Word 的编辑功能. 常用的富文本编辑器: KindEdi ...
- 小学四则运算口算练习app---No.3
今天主要是实现按照指定的题目出题数目出题.在昨天设置页面的基础上,今天首先要学习的是接收不同页面间的参数问题.详解如下: 然后就开始我的传参和接收参数的问题! 在当前的Activity上进行跳转, 代 ...
- VS 编译总是出现错误: "LC.EXE 已退出,代码为-1"
最近在开发CS的一个项目时,编译总是出现错误: "LC.EXE 已退出,代码为-1" 解决方法一:用记事本打开*.licx,里面写的全是第三方插件的指定DLL,删除错误信息,保存, ...