[翻译]AKKA笔记 - CHILD ACTORS与ACTORPATH -6
原文:http://rerun.me/2014/10/21/akka-notes-child-actors-and-path/
Actor是完全的继承结构。你创建的任何Actor肯定都是一个其他Actor的child。
让我们分析下:
PATH
我们用ActorSystem.actorof创建一个ActorRef并打印出他的path
val actorSystem=ActorSystem("SupervisionActorSystem")
val actorRef=actorSystem.actorOf(Props[BasicLifecycleLoggingTeacherActor])
println (actorRef.path) // (prints) akka://SupervisionActorSystem/user/$a
可以看到,一个path看起来很像是文件系统中的一个文件路径。
这里的akka是固定的,因为这些都是Akka Actor的地址 - 与file://和http://前缀差不多(跟协议没啥关系)
SupervisionActorSystem就是你创建的ActorSystem的名字。
user我们下节再说。
$a是系统为你生成出来的Actor的名字。你对操作系统给你随机生成的文件名怎么看?很明显是人都不喜欢,因为你之后还要用这个名字。所以,让我们给他一个有意义的名字:
val actorRef=actorSystem.actorOf(Props[BasicLifecycleLoggingTeacherActor], "teacherActor")
println (actorRef.path) // (prints) akka://SupervisionActorSystem/user/teacherActor
现在这个路径(path)看起来差不多了。

CHILD ACTORS
跟从ActorSystem里面创建的顶级actor类似,我们也可以给ActorContext创建child actor。事实上, Actor的容错能力很大程度上就是靠使用Actor的继承层次和一个parent管理child actor的生命周期的方式。
现在假设你又一个TeacherSupervisor并且你打算创建一个TeacherActor来作为Supervisor的child,可以用ActorContext.actorof来代替使用ActorSystem.actorof:
class TeacherSupervisor extends Actor with ActorLogging {
val teacherActor=context.actorOf(Props[TeacherActor], "teacherActor")
...
...
基本上,在任何应用里,不像顶层actor,你会创建一堆的child actor - 这意思就是与调用actorSystem.actorof不同,你会调用一堆actorContext.actor

你会注意到child actor的path是akka://SupervisionActorSystem/user/teacherSupervisor/teacherActor,看起来跟给父目录创建一个子目录是一样的。
你什么时候开始创建子Actor?
在你的任务是由子任务或多个子任务组成的时候你就应该创建一个子actor了。在你执行的子任务是一个易错的时候,你想要隔离他(这样如果错了,你能恢复他)的时候你也需要创建一个子actor。当task之间没有父子关系时,你千万别创建子actor。
并且,还可以让子actor创建自己的子actor来代理他们自己的子任务。Actor的创建成本很低但产出却很高(我们在谈supervision的时候可以看到这个)
现在那个PATH中的USER是什么?
作为一个对比,我把ActorSystem比拟成一个Unix文件系统 - 有一个/root目录,还有其他的/etc,/usr,/bin和其他目录。
ActorSystem跟那个差不多。他创建一些顶层Actor - 最重要根Actor就是根目录/, user Actor就是/usrr目录,一个system Actor就是一个/system目录。(还有一个/deadLetters来代表DeadLetterActorRef。我们在上一篇里面看到过)
ActorSystem内组合了三个Actor(从ActorRefProvider)。他们是ActorSystem创建的所有actor的根actor。
- systemGuardian actor - 所有在/system下的actor的根
- guardian actor - 所有/user下actor的根
- rootGuardian Actor - systemGuardian和userGuardianactor
的根
/**
* Reference to the supervisor of guardian and systemGuardian; ....
*/
def rootGuardian: InternalActorRef
/**
* Reference to the supervisor used for all top-level user actors.
*/
def guardian: LocalActorRef
/**
* Reference to the supervisor used for all top-level system actors.
*/
def systemGuardian: LocalActorRef

/user(aka) user guardian
任何你在自己程序中像StudentActor或TeacherActor用ActorSystem的actof方法来创建的Actor都直接在/user。这就是之前teacherActor的路径是/user/teacherActor的原因。
/system(aka) system guardian
当userGuardian死的时候system guardian会将自己关闭。当userGuardian关闭时这是合乎常理的, 他下面所有的业务actor都停掉了所以所有的管理员actor都需要一样停掉。
我们能看到System Actor被创建在两个地方 - 意思是在**/system*继承关系下的actor。
像我们之前看到的,所有发给一个已经终结掉的Actor的消息都会被转发给一个内部Actor(DeadLetterActor)的邮箱。DeadLetter Actor把每个消息包装成DeadLetter*然后发送给EventStream。另一个叫DeadLetterListener的Actor消费所有的DeadLetter并且将其作为一个日志消息发送出去。现在,DeadLetterListener是一个在/system/deadLetterListener**下的system Actor。
想想我们之前写的订阅了EventStream的日志消息的TestEventListener?他们也是System actor。事实上,所有的akka.logger都是作为System actor来创建的。
class TeacherTest extends TestKit(ActorSystem("UniversityMessageSystem", ConfigFactory.parseString("""akka.loggers = ["akka.testkit.TestEventListener"]""")))
...
...
这个文档提到所有用配置文件配置的Actor都会在启动的时候被创建并部署到ActorSystem,躲在/system的保护伞下。当我找到有趣的地方再更新下这个。
/(aka)root guardian
像我们之前看到的,/下的Actor是user和system guardian的父 actor。
杂七杂八
技术上来讲,root actor也有个父actor。这个actor的唯一任务就是当root actor失败是关闭整个ActorSystem。因此他没有被算在Actor的继承结构里, Akka项目组叫他:
private[akka] val theOneWhoWalksTheBubblesOfSpaceTime: InternalActorRef = new MinimalActorRef {
...
文章来自微信平台「麦芽面包」(微信扫描二维码关注)。未经允许,禁止转载。

[翻译]AKKA笔记 - CHILD ACTORS与ACTORPATH -6的更多相关文章
- 翻译:AKKA笔记 - 介绍Actors
任何以前做过多线程的人都不会否认管理多线程程序是困难并且痛苦的. 我说管理是因为它开始很容易而且当你看到性能提升时会很兴奋.但是,当你看到你没法从子线程的错误中恢复 或者 这些僵尸bug很难重现 或者 ...
- [翻译]AKKA笔记 - ACTOR MESSAGING - REQUEST AND RESPONSE -3
上次我们看Actor消息机制,我们看到开火-忘记型消息发出(意思是我们只要发个消息给Actor但是不期望有响应). 技术上来讲, 我们发消息给Actors就是要它的副作用. 这就是这么设计的.除了不响 ...
- [翻译]AKKA笔记 - LOGGING与测试ACTORS -2 (二)
3.THROW IN A LOGBACK.XML 现在我们把SLF4J日志配置在logback. <?xml version="1.0" encoding="UTF ...
- [翻译]AKKA笔记 - LOGGING与测试ACTORS -2 (一)
在前两章 ( 一 , 二 ) ,我们大致讲了Actor和message是怎么工作的,让我们看一下日志和测试我们的 TeacherActor . RECAP 这是上一节我们的Actor代码: class ...
- [翻译]AKKA笔记 -ACTOR SUPERVISION - 8
失败更像是分布式系统的一个特性.因此Akka用一个容忍失败的模型,在你的业务逻辑与失败处理逻辑(supervision逻辑)中间你能有一个清晰的边界.只需要一点点工作,这很赞.这就是我们要讨论的主题. ...
- [翻译]AKKA笔记 - DEATHWATCH -7
当我们说Actor生命周期的时候,我们能看到Actor能被很多种方式停掉(用ActorSystem.stop或ActorContext.stop或发送一个PoisonPill - 也有一个kill和g ...
- [翻译] AKKA笔记- ACTORSYSTEM (配置CONFIGURATION 与调度SCHEDULING) - 4(一)
原文在http://rerun.me/2014/10/06/akka-notes-actorsystem-in-progress/ 像我们前面看到的,我们可以用ActorSystem的actorof方 ...
- [翻译]AKKA笔记 - 有限状态机 -1
原文地址:http://rerun.me/2016/05/21/akka-notes-finite-state-machines-1/ 我最近有个机会在工作上使用了Akka FSM,是个非常有趣的例子 ...
- [翻译]AKKA笔记 - ACTOR生命周期 - 基本 -5
原文地址:http://rerun.me/2014/10/21/akka-notes-actor-lifecycle-basic/ (请注意这了讨论的生命周期并不包括 preRestart 或者pos ...
随机推荐
- CSS的未来
仅供参考 前言 完成<CSS核心技术与实战>这本书,已有一个多月了,而这篇文章原本是打算写在那本书里面的,但本章讲解的内容,毕竟属于CSS未来的范畴,而这一切都还不能够确定下来,所以这一章 ...
- 【.net 深呼吸】序列化中的“引用保留”
假设 K 类中有两个属性/字段的类型相同,并且它们引用的是同一个对象实例,在序列化的默认处理中,会为每个引用单独生成数据. 看看下面两个类. [DataContract] public class 帅 ...
- ABP文档 - Javascript Api - Message
本节内容: 显示信息 确认 Message API给用户显示一个信息,或从用户那里获取一个确认信息. Message API默认使用sweetalert实现,为使sweetalert正常工作,你应该包 ...
- Java学习之反射机制及应用场景
前言: 最近公司正在进行业务组件化进程,其中的路由实现用到了Java的反射机制,既然用到了就想着好好学习总结一下,其实无论是之前的EventBus 2.x版本还是Retrofit.早期的View注解框 ...
- Android N开发 你需要知道的一切
title: Android N开发 你需要知道的一切 tags: Android N,Android7.0,Android --- 转载请注明出处:http://www.cnblogs.com/yi ...
- 深入Java虚拟机--判断对象存活状态
程序计数器,虚拟机栈和本地方法栈 首先我们先来看下垃圾回收中不会管理到的内存区域,在Java虚拟机的运行时数据区我们可以看到,程序计数器,虚拟机栈,本地方法栈这三个地方是比较特别的.这个三个部分的特点 ...
- 说一说python的牛比与不爽
本人写了10年php了.今年开始改写python了.不是说php有什么不好,php在自己的势力范围内还是很牛比的.只是我已经不能满足于php那两亩地了. 习惯了脚本,所以很自然就过度到python了. ...
- Android之数据存储的五种方法
1.Android数据存储的五种方法 (1)SharedPreferences数据存储 详情介绍:http://www.cnblogs.com/zhangmiao14/p/6201900.html 优 ...
- Android 指纹认证
安卓指纹认证使用智能手机触摸传感器对用户进行身份验证.Android Marshmallow(棉花糖)提供了一套API,使用户很容易使用触摸传感器.在Android Marshmallow之前访问触摸 ...
- 直播推流端弱网优化策略 | 直播 SDK 性能优化实践
弱网优化的场景 网络直播行业经过一年多的快速发展,衍生出了各种各样的玩法.最早的网络直播是主播坐在 PC 前,安装好专业的直播设备(如摄像头和麦克风),然后才能开始直播.后来随着手机性能的提升和直播技 ...