路由概念

大量的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路由的更多相关文章

  1. (转)akka Router实例

    通常在分布式任务调度系统中会有这样的需求:一组actor提供相同的服务,我们在调用任务的时候只需要选择其中一个actor进行处理即可. 其实这就是一个负载均衡或者说路由策略,akka作为一个高性能支持 ...

  2. 前端MVC Vue2学习总结(八)——Vue Router路由、Vuex状态管理、Element-UI

    一.Vue Router路由 二.Vuex状态管理 三.Element-UI Element-UI是饿了么前端团队推出的一款基于Vue.js 2.0 的桌面端UI框架,手机端有对应框架是 Mint U ...

  3. 全面解析JavaScript的Backbone.js框架中的Router路由

    这篇文章主要介绍了Backbone.js框架中的Router路由功能,Router在Backbone中相当于一个MVC框架中的Controller控制器功能,需要的朋友可以参考下. Backbone ...

  4. React初识整理(四)--React Router(路由)

    官网:https://reacttraining.com/react-router 后端路由:主要做路径和方法的匹配,从而从后台获取相应的数据 前端路由:用于路径和组件的匹配,从而实现组件的切换. 如 ...

  5. hbuilderX创建vue项目之添加router路由(前端萌新)

    作为一个刚刚接触前端不久的新人来说,熟悉了一种目录结构或者项目创建方法以后,恨不得一辈子不会变! 可是人要生活,就要工作,既然是打工,当然要满足雇佣者的要求. 今天我来说说 hbuilderX 这个开 ...

  6. router路由的使用

    router路由的使用 1.使用nuxt-link来跳转路由 <!-- 要跳转的路由的地址就是pages文件夹中定义的xxx.vue的前缀名--> <nuxt-link to=&qu ...

  7. Angular 从入坑到挖坑 - Router 路由使用入门指北

    一.Overview Angular 入坑记录的笔记第五篇,因为一直在加班的缘故拖了有一个多月,主要是介绍在 Angular 中如何配置路由,完成重定向以及参数传递.至于路由守卫.路由懒加载等&quo ...

  8. router路由配置

    vue项目中router路由配置   介绍 路由:控制组件之间的跳转,不会实现请求.不用页面刷新,直接跳转-切换组件>>> 安装 本地环境安装路由插件vue-router:    c ...

  9. < react router>: (路由)

    < react router> (路由): 思维导图: Atrial   文件夹下的index.js 文件内容: import React, { Component } from 'rea ...

随机推荐

  1. 深挖Jvm垃圾收集

    垃圾收集(Garbage Collection,GC),它的任务是解决以下 3 件问题: 哪些内存需要回收? 什么时候回收? 如何回收? 其中第一个问题很好回答,在 Java 中,GC 主要发生在 J ...

  2. Mybatis逆向工程的使用。

    指定配置文件与main运行生成 public class GeneratorSqlmap { public void generator() throws Exception { List<St ...

  3. current transaction is aborted, commands ignored until end of transaction block

    current transaction is aborted, commands ignored until end of transaction block Error updating datab ...

  4. URL&HTTP协议

    一般来讲,URL地址有五个部分组成,协议,域名,端口,路径,URL地址参数,通常“//'之前的部分就是协议 常用的协议有: http 超文本传输协议 htttps http+ssl ssh 用来实现远 ...

  5. 《linux就该这么学》课堂笔记08 用户权限、特殊权限、隐藏权限、su、sudo

    1.文件的读.写.执行权限可以简写为 r w x,亦可分别用数字4.2.1来表示 2.文件的特殊权限 2.1.SUID是一种对二进制程序进行设置的特殊权限,可以让二进制程序的执行者临时拥有属主的权限( ...

  6. How to: Create a C/C++ Union by Using Attributes (C#)

    [How to: Create a C/C++ Union by Using Attributes (C#)] 1.you can create what is known as a union in ...

  7. scikit-leanr 库中的 make_blobs() 函数

    sklearn.datasets.make_blobs() 是用于创建多类单标签数据集的函数,它为每个类分配一个或多个正态分布的点集. sklearn.datasets.make_blobs( n_s ...

  8. Eclipse调用Tomcat出错

    错误提示:The server cannot be started because one or more of the ports are invalid. Open the server edit ...

  9. rhel6安装rabbitmq-sever

    1.下载rabbitmq-sever3.7.7,我下的是RHEL/CentOS 6.x, 你的系统是哪个版本就下哪个https://github.com/rabbitmq/ Downloadson G ...

  10. JDOJ 1133 分段公司利润

    JDOJ 1133: 分段公司利润 JDOJ传送门 Description 企业发放的奖金根据利润提成.利润低于或等于100000元的,奖金可提10%; 利润高于100000元,低于200000元(1 ...