[翻译]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 ...
随机推荐
- 自定义基于 VLC 的视频播放器
前言(蛋疼的背景故事) 前段时间,接了一个小项目,有个需求是要在系统待机一段时间以后,循环播放 MV(类似于 Windows 系统的屏幕保护). 听到这个需求,我首先想到的是 MediaPlayer ...
- 【社工】NodeJS 应用仓库钓鱼
前言 城堡总是从内部攻破的.再强大的系统,也得通过人来控制.如果将入侵直接从人这个环节发起,那么再坚固的防线,也都成为摆设. 下面分享一个例子,利用应用仓库,渗透到开发人员的系统中. 应用仓库 应用仓 ...
- REST简介
一说到REST,我想大家的第一反应就是“啊,就是那种前后台通信方式.”但是在要求详细讲述它所提出的各个约束,以及如何开始搭建REST服务时,却很少有人能够清晰地说出它到底是什么,需要遵守什么样的准则. ...
- Android权限管理之Permission权限机制及使用
前言: 最近突然喜欢上一句诗:"宠辱不惊,看庭前花开花落:去留无意,望天空云卷云舒." 哈哈~,这个和今天的主题无关,最近只要不学习总觉得生活中少了点什么,所以想着围绕着最近面试过 ...
- Android数据加密之MD5加密
前言: 项目中无论是密码的存储或者说判断文件是否是同一文件,都会用到MD5算法,今天来总结一下MD5加密算法. 什么是MD5加密? MD5英文全称“Message-Digest Algorithm 5 ...
- 玩转Vim 编辑器
一:VIM快速入门 1.vim模式介绍 以下介绍内容来自维基百科Vim 从vi演生出来的Vim具有多种模式,这种独特的设计容易使初学者产生混淆.几乎所有的编辑器都会有插入和执行命令两种模式,并且大多数 ...
- ABP项目中使用Swagger生成动态WebAPI
本文是根据角落的白板报的<使用ABP实现SwaggerUI,生成动态webapi>一文的学习总结,感谢原文作者角落的白板报. 1 安装Swashbuckle.core 1.1 选择WebA ...
- gulp批量打包文件并提取公共文件
gulp是前端开发过程中对代码进行构建的工具,是自动化项目的构建利器. browseriyf是模块化打包工具. 一般情况下,Browserify 会把所有的模块打包成单个文件.单个文件在大多数情况下是 ...
- 升级npm
查看npm的所有版本 运行命令: npm view npm versions 命令运行后,会输出到目前为止npm的所有版本. [ '1.1.25', '1.1.70', '1.1.71', '1.2. ...
- iOS 多线程之GCD的使用
在iOS开发中,遇到耗时操作,我们经常用到多线程技术.Grand Central Dispatch (GCD)是Apple开发的一个多核编程的解决方法,只需定义想要执行的任务,然后添加到适当的调度队列 ...