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锚定的更多相关文章

  1. akka设计模式系列-慎用ask

    慎用ask应该是Akka设计的一个准则,很多时候我们应该禁用ask.之所以单独把ask拎出来作为一篇博文,主要是akka的初学者往往对ask的使用比较疑惑. "Using ask will ...

  2. akka设计模式系列

    由于本人爱好Scala,顺便也就爱好Akka,但目前网上对Akka的介绍大多都是概念上或技术方向上的介绍,基本没有Akka设计模式或者Actor模型设计模式的资料.这对于Akka的普及非常不利,因为即 ...

  3. akka设计模式系列-消息模型(续)

    在之前的akka设计模式系列-消息模型中,我们介绍了akka的消息设计方案,但随着实践的深入,发现了一些问题,这里重新梳理一下设计方法,避免之前的错误.不当的观点给大家带来误解. 命令和事件 我们仍然 ...

  4. akka设计模式系列(Actor模型)

    谈到Akka就必须介绍Actor并发模型,而谈到Actor就必须看一篇叫做<A Universal Modular Actor Formalism for Artificial Intellig ...

  5. akka设计模式系列-While模式

    While模式严格来说是while循环在Akka中的合理实现.while是开发过程中经常用到的语句之一,也是绝大部分编程语言都支持的语法.但while语句是一个循环,如果循环条件没有达到会一直执行wh ...

  6. akka设计模式系列-Chain模式

    链式调用在很多框架和系统中经常存在,算不得上是我自己总结的设计模式,此处只是简单介绍在Akka中的两种实现方式.我在这边博客中简化了链式调用的场景,简化后也更符合Akka的设计哲学. trait Ch ...

  7. akka设计模式系列-消息模型

    通过前面的文章我们总结了几个常见的actor设计模式,但此处不得不提前介绍一下在Akka中消息的设计模式.随着对Akka的使用,我们会发现,使用Akka设计系统其实就是面向消息编程.actor之间消息 ...

  8. akka设计模式系列-Backend模式

    上一节我们介绍了Akka使用的基本模式,简单点来说就是,发消息给actor,处理结束后返回消息.但这种模式有个缺陷,就是一旦某个消息处理的比较慢,就会阻塞后面所有消息的处理.那么有没有方法规避这种阻塞 ...

  9. akka设计模式系列-akka在秒杀场景的应用

    本博客讨论一下akka在秒杀场景下的应用,提出自己的见解,只做抛砖引玉,大神勿喷.秒杀活动涉及到前中后台各个阶段,为了说明问题,我们简化场景,只研究akka在后台如何处理秒杀业务. 秒杀活动 所谓的秒 ...

随机推荐

  1. Tampermonkey脚本安装问题及自用脚本推荐

    对于高手来说,chrome浏览器中即使没有其他任何chrome插件,可能都无关紧要.但是有一个插件必不可少, 那就是Tampermonkey油猴插件.Tampermonkey是Chrome上最流行的用 ...

  2. Python-文件和数据格式化

    文件的使用 >文件的类型 文件的理解:文件是数据的抽象和集合 -文件时存储在辅助存储器上的数据序列 -文件是数据存储的一种形式 -文件展现形态:文本文件和二进制文件 文本文件vs.二进制文件 - ...

  3. java诗词横版--转为竖版

    import java.util.Arrays; /* 诗句横版转成竖版输出 */public class PrintPoem { public static void main(String[] a ...

  4. STM32单片机串口一键下载电路与操作方法详解

    STM32三种启动模式对应的存储介质均是芯片内置的,它们是:1)用户闪存 = 芯片内置的Flash.2)SRAM = 芯片内置的RAM区,就是内存啦.3)系统存储器 = 芯片内部一块特定的区域,芯片出 ...

  5. 负载均衡之Ocelot+Consul(WebAPI注册服务)

    上一篇   负载均衡之Ocelot+Consul(文件配置注册服务),介绍了如何通过json文件注册服务,本篇将学习如何通过web api 注册服务. 在展开学习过程之前,且先总结一下 consul服 ...

  6. 如何绘制caffe网络训练曲线

    本系列文章由 @yhl_leo 出品,转载请注明出处. 文章链接: http://blog.csdn.net/yhl_leo/article/details/51774966 当我们设计好网络结构后, ...

  7. GUI 总结(一)

    一/概述 1.两个包: javax.awt //before java 1.2 javax.swing //after java 1.2 2.两个词: 组件Component 容器Container ...

  8. fibonacci数列的题目——剑指Offer

    https://www.nowcoder.net/practice/c6c7742f5ba7442aada113136ddea0c3?tpId=13&tqId=11160&tPage= ...

  9. XAPIAN简单介绍(三)

    今天主要介绍的是Xapian::Database这个类.先上图 看上去就非常恐怖的吧,我们一点点的说. 首先一切的開始都来自那个include目录中的database.h,他的直接实现是在omdata ...

  10. Android 内存管理

    1.Activity中的对象生命周期勿大于Activity的生命周期.OOM演示样例代码例如以下: private static Drawable sBackground; @Override pro ...