akka设计模式系列-actor锚定
actor锚定模式是指使用actorSelection对acor进行锚定的设计模式,也可以说是一个对actor的引用技巧。在某些情况下,我们可能需要能够根据Actor的path锚定对应的实例。简单来说就是,无论actor是因为异常导致的restart还是用户主动stop,然后再重新actorOf,只要actor的路径和name相同,我们都希望把消息发送给改Actor的一个实例。那我们来看一下actorSelection和ActorRef的使用区别。
class AnchorActor extends Actor{
override def preStart(): Unit = {
super.preStart()
println(s"self=$self,path=${self.path}")
}
override def receive: Receive = {
case any =>
println(s"Hello $any")
}
}
object AnchorPattern{
def main(args: Array[String]): Unit = {
val system = ActorSystem("AnchorPattern",ConfigFactory.load())
val anchorActor = system.actorOf(Props(new AnchorActor),"anchorActor")
anchorActor ! 1
val anchorActorSelection = system.actorSelection("/user/anchorActor")
anchorActorSelection ! 2
system.stop(anchorActor)
// 等待anchorActor彻底stop
Thread.sleep(3*1000)
system.actorOf(Props(new AnchorActor),"anchorActor")
anchorActor ! 3
anchorActorSelection ! 4
}
}
输出:
self=Actor[akka://AnchorPattern/user/anchorActor#-1941442858],path=akka://AnchorPattern/user/anchorActor
Hello 1
Hello 2
self=Actor[akka://AnchorPattern/user/anchorActor#489200584],path=akka://AnchorPattern/user/anchorActor
Hello 4
[INFO] [07/31/2018 16:59:48.102] [AnchorPattern-akka.actor.default-dispatcher-5] [akka://AnchorPattern/user/anchorActor] Message [java.lang.Integer] without sender to Actor[akka://AnchorPattern/user/anchorActor#-1941442858] was not delivered. [1] dead letters encountered. If this is not an expected behavior, then [Actor[akka://AnchorPattern/user/anchorActor#-1941442858]] may have terminated unexpectedly, This logging can be turned off or adjusted with configuration settings 'akka.log-dead-letters' and 'akka.log-dead-letters-during-shutdown'.
上面代码中,我们创建了一个AnchorActor实例,然后通过ActorRef和ActorSelection分别给AnchorActor发送了两条消息,anchorActor都收到了。之后我们把之前的AnchorActor实例给stop掉,再ActorRef和ActorSelection分别发送消息,由输出我们可以看出,第二次发消息时,只有anchorActorSelection发送成功了。这就证明了,ActorRef只能指向Actor的某个特定实例;而ActorSelection通过路径指向Actor的所有实例,即使该actor的实例被销毁然后重新创建,ActorSelection也能指向新的实例。
我这篇博客把ActorSelection发消息成为actor锚定模式,主要是想告诉读者ActorSelection与ActorRef的区别。那读者可能会问,既然ActorSelection可以对actor进行锚定,能指向最新的实例,为什么还要有ActorRef存在的必要呢?其实这要区别对待,结合场景来谈具体使用哪种形式。如果你的业务场景下,不区分Actor的实例,只要路径和name相同,就把所有的消息发送给它,那就是用ActorSelection;如果你的场景需要严格区分Actor的实例,比如不同的实例就代表不同的服务对象,不同服务对象的结果是不同的,此时就需要用ActorRef来通信。另外ActorSelection是无法保证对应路径的actor存在的,也就是说ActorSelection可能会把消息发送到deadLetters,而开发者是无法知道的;ActorRef一旦存在就可以发送消息,对方的Actor一定存在,当然消息也可能无法送达,比如对方的actor被stop掉或者网络故障。
虽然这个设计模式比较简单,但希望读者能够严格区分二者的关系,在合适的场景使用合适的技术。
akka设计模式系列-actor锚定的更多相关文章
- akka设计模式系列-慎用ask
慎用ask应该是Akka设计的一个准则,很多时候我们应该禁用ask.之所以单独把ask拎出来作为一篇博文,主要是akka的初学者往往对ask的使用比较疑惑. "Using ask will ...
- akka设计模式系列
由于本人爱好Scala,顺便也就爱好Akka,但目前网上对Akka的介绍大多都是概念上或技术方向上的介绍,基本没有Akka设计模式或者Actor模型设计模式的资料.这对于Akka的普及非常不利,因为即 ...
- akka设计模式系列-消息模型(续)
在之前的akka设计模式系列-消息模型中,我们介绍了akka的消息设计方案,但随着实践的深入,发现了一些问题,这里重新梳理一下设计方法,避免之前的错误.不当的观点给大家带来误解. 命令和事件 我们仍然 ...
- akka设计模式系列(Actor模型)
谈到Akka就必须介绍Actor并发模型,而谈到Actor就必须看一篇叫做<A Universal Modular Actor Formalism for Artificial Intellig ...
- akka设计模式系列-While模式
While模式严格来说是while循环在Akka中的合理实现.while是开发过程中经常用到的语句之一,也是绝大部分编程语言都支持的语法.但while语句是一个循环,如果循环条件没有达到会一直执行wh ...
- akka设计模式系列-Chain模式
链式调用在很多框架和系统中经常存在,算不得上是我自己总结的设计模式,此处只是简单介绍在Akka中的两种实现方式.我在这边博客中简化了链式调用的场景,简化后也更符合Akka的设计哲学. trait Ch ...
- akka设计模式系列-消息模型
通过前面的文章我们总结了几个常见的actor设计模式,但此处不得不提前介绍一下在Akka中消息的设计模式.随着对Akka的使用,我们会发现,使用Akka设计系统其实就是面向消息编程.actor之间消息 ...
- akka设计模式系列-Backend模式
上一节我们介绍了Akka使用的基本模式,简单点来说就是,发消息给actor,处理结束后返回消息.但这种模式有个缺陷,就是一旦某个消息处理的比较慢,就会阻塞后面所有消息的处理.那么有没有方法规避这种阻塞 ...
- akka设计模式系列-akka在秒杀场景的应用
本博客讨论一下akka在秒杀场景下的应用,提出自己的见解,只做抛砖引玉,大神勿喷.秒杀活动涉及到前中后台各个阶段,为了说明问题,我们简化场景,只研究akka在后台如何处理秒杀业务. 秒杀活动 所谓的秒 ...
随机推荐
- Maya Calendar POJ - 1008 (模拟)
简述 注意260天的情况,这个地方还是0年 代码 #include <iostream> #include <map> #include <sstream> usi ...
- 把 web 项目部署到 Linux 服务器上
1.打开 eclipse,在已经完成的 web 项目上面点击右键,选择 export,然后选择导出成 war 包. 以部署 SMBMS 项目为例 2.项目打包成 war ,选择项目导出到的位置. ...
- Djang学习笔记-1
1.django的生命周期: url匹配 -> 视图函数 -> 返回用户字符串 url匹配 -> 视图函数 -> 打开一个HTML文件,并读取内容2.创建Django proj ...
- springcloud(十三):Ribbon客户端负载均衡实例
一.采用默认的负载均衡策略:RoundRobinRule 轮询策略 1.修改提供者原的控制类 在之前的eureka-client-provider项目的CenterController.java中加入 ...
- vue api
1. vue.config.silent = true 取消 Vue 所有的日志与警告. 2.vue.config.productionTip= false 设置为 false 以阻止 vue 在启动 ...
- redis学习——系统管理
Redis系统管理 实验简介 上一节实验讲述了Redis的基本数据类型,本实验继续讲解Redis相关命令及管理操作. 在Redis中,命令大小写不敏感. 一.适合全体类型的常用命令 启动redis服务 ...
- 《Spring Boot 那些事》
<Spring Boot 那些事>----https://www.bysocket.com/?p=1124
- HDU 4902 (牛叉的线段树)
Nice boat Problem Description There is an old country and the king fell in love with a devil. The de ...
- PatentTips – Shader Interfaces
BACKGROUND Today's graphic processing units (GPUs) host all of the computations necessary to generat ...
- HDU——2588 GCD
题目大意: 求1~N中与N的最大公约数大于M的个数 思路: 这个题是不是可以想到暴力枚举??对于每一组数据枚举与他的最大公约数大于m的数的个数. 是,这种做法没错误,但是保准你T成狗.... 我们至少 ...