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 变量作用域、闭包
先看一个问题: 下面代码输出的结果是0,换句话说,这个fucn2虽然已经用global声明了variable1,但还是没有改变变量的值 def func1(): variable1=0 def fun ...
- Spring @Import注解源码解析
简介 Spring 3.0之前,创建Bean可以通过xml配置文件与扫描特定包下面的类来将类注入到Spring IOC容器内.而在Spring 3.0之后提供了JavaConfig的方式,也就是将IO ...
- JAVA中的四种JSON解析方式详解
JAVA中的四种JSON解析方式详解 我们在日常开发中少不了和JSON数据打交道,那么我们来看看JAVA中常用的JSON解析方式. 1.JSON官方 脱离框架使用 2.GSON 3.FastJSON ...
- qtp安装和使用
QTP许可证密钥的破解步骤: 以前使用QTP9.2 使用此方法成功破解,现在本人使用的HP QuickTest Professional 11 英文版,也成功适用. 一.准备工作: 1. 由于注册码文 ...
- java基本类型的长度
bit:位,一个二进制数据(0或者1),是1bit byte:字节,存储空间的基本单位,1byte=8bit 一个英文占一个字节,1字母=1byte=8bit 一个中文占两个字节,1汉字=2byte= ...
- 使用PSCI机制的SMP启动分析
其他core的入口 文件:arch/arm64/kernel/head.S secondary_entry: 在从bl31切到EL1上的Linux Kernel后: 第595行,在el2_setup中 ...
- Centos6.5硬盘故障修复
以企业Centos6.5Linux为案例来修复系统,步骤如下: (1)远程备份本地其他重要数据,出现只读文件系统,需要先备份其他重要数据基于rsync|scp远程备份,其中/data为源目录,/dat ...
- Nginx 核心配置-单节点实现多域名访问
Nginx 核心配置-单节点实现多域名访问 作者:尹正杰 版权声明:原创作品,谢绝转载!否则将追究法律责任. 一.试验环境说明 1>.虚拟机环境说明 [root@node101.yinzheng ...
- Linux之基础系统优化
Linux基础系统优化 >>> https://www.cnblogs.com/pyyu/p/9355477.html Linux的网络功能相当强悍,一时之间我们无法了解所有的网络命 ...
- 线程三态和JVM线程状态
1.线程三态:就绪态.运行态.阻塞态 2.JVM中的六种状态 NEW(新建状态):一个尚未启动的线程所处的状态. RUNNABLE(可运行状态):可运行线程的线程状态,可能正在运行,也可能在等待处理器 ...