[翻译]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 ...
随机推荐
- 隐私泄露杀手锏 —— Flash 权限反射
[简版:http://weibo.com/p/1001603881940380956046] 前言 一直以为该风险早已被重视,但最近无意中发现,仍有不少网站存在该缺陷,其中不乏一些常用的邮箱.社交网站 ...
- jQuery动画-圣诞节礼物
▓▓▓▓▓▓ 大致介绍 下午看到了一个送圣诞礼物的小动画,正好要快到圣诞节了,就动手模仿并改进了一些小问题 原地址:花式轮播----圣诞礼物传送 思路:动画中一共有五个礼物,他们平均分布在屏幕中,设置 ...
- Linux 添加新磁盘,在线扩充空间
CentOS 7开发环境中的home 目录空间满了,需要增加空间 到虚拟机上执行"ls /sys/class/scsi_host",然后重新扫描SCSI总线来添加设备.如右图.然后 ...
- android通过webview调起支付宝app支付
webview在加载网页的时候会默认调起手机自带的浏览器加载网页,用户体验不好.但当用户设置浏览器客户端(setWebViewClient)设置这样的监听事件之后,当请求url的时候就不会打开手机自带 ...
- 高效而稳定的企业级.NET Office 组件Spire(.NET组件介绍之二)
在项目开发中,尤其是企业的业务系统中,对文档的操作是非常多的,有时几乎给人一种错觉的是”这个系统似乎就是专门操作文档的“.毕竟现在的很多办公中大都是在PC端操作文档等软件,在这些庞大而繁重的业务中,单 ...
- Spring中Bean的实例化
Spring中Bean的实例化 在介绍Bean的三种实例化的方式之前,我们首先需要介绍一下什么是Bean,以及Bean的配置方式. 如果 ...
- 【Java每日一题】20170105
20170104问题解析请点击今日问题下方的"[Java每日一题]20170105"查看(问题解析在公众号首发,公众号ID:weknow619) package Jan2017; ...
- Java实现Excel中的NORMSDIST函数和NORMSINV函数
由于工作中需要将Excel中的此两种函数转换成java函数,从而计算内部评级的资本占用率和资本占用金额.经过多方查阅资料和整理,总结出如下两个转换方法 标准正态分布累计函数NORMSDIST: pub ...
- StrategyPattern (策略模式)
/** * 策略模式 * @author TMAC-J * 根据环境的不同选择不同的策略,把策略用接口抽象出来 */ public class StrategyPattern { interface ...
- sqlyog导出json数据格式支持mysql数据转存mongodb
<!-------------知识的力量是无限的(当然肯定还有更简单的方法)-----------!> 当我考虑将省市区三级联动数据从mysql转入mongodb时遇到了网上无直接插入mo ...