原文: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看起来很像是文件系统中的一个文件路径。

  1. 这里的akka是固定的,因为这些都是Akka Actor的地址 - 与file://http://前缀差不多(跟协议没啥关系)

  2. SupervisionActorSystem就是你创建的ActorSystem的名字。

  3. user我们下节再说。

  4. $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。

  1. systemGuardian actor - 所有在/system下的actor的根
  2. guardian actor - 所有/user下actor的根
  3. rootGuardian Actor - systemGuardian和**userGuardian**actor
    的根
  /*** 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

任何你在自己程序中像StudentActorTeacherActorActorSystemactof方法来创建的Actor都直接在/user。这就是之前teacherActor的路径是/user/teacherActor的原因。

/system(aka) system guardian

userGuardian死的时候system guardian会将自己关闭。当userGuardian关闭时这是合乎常理的, 他下面所有的业务actor都停掉了所以所有的管理员actor都需要一样停掉。

我们能看到System Actor被创建在两个地方 - 意思是在*/system继承关系下的actor。

  1. 像我们之前看到的,所有发给一个已经终结掉的Actor的消息都会被转发给一个内部Actor(DeadLetterActor)的邮箱。DeadLetter Actor把每个消息包装成DeadLetter*然后发送给EventStream。另一个叫**DeadLetterListener的Actor消费所有的DeadLetter并且将其作为一个日志消息发送出去。现在,DeadLetterListener是一个在/system/deadLetterListener下的system Actor。

  2. 想想我们之前写的订阅了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相关推荐

  1. UE4蓝图节点翻译--- Get All Child Actors

    翻译人:灵月散人 参考的引擎版本:4.18.3 翻译内容仅作临时参考,目的是为了降低无基础者初期的学习门槛. 所以当书写.交流.等实际使用时切记: 须以英文为准 官网地址 Get All Child ...

  2. [翻译]AKKA笔记 - DEATHWATCH -7

    当我们说Actor生命周期的时候,我们能看到Actor能被很多种方式停掉(用ActorSystem.stop或ActorContext.stop或发送一个PoisonPill - 也有一个kill和g ...

  3. [翻译] AKKA笔记- ACTORSYSTEM (配置CONFIGURATION 与调度SCHEDULING) - 4(二)

    原文地址 http://rerun.me/2014/10/06/akka-notes-actorsystem-in-progress/ 2. SCHEDULE 可以看到在ActorSystem的API ...

  4. 增量式分级判别回归树(IHDR)|翻译与笔记

    增量式分级判别回归树(IHDR)|翻译与笔记 为什么翻译这篇发表于2007年的老论文呢?主要有以下四方面原因: (1)这篇论文较清晰地给出增量式学习的概念. (2)论文有一定的理论与应用方面的价值. ...

  5. 联邦学习笔记-《Federated Machine Learning: Concept and Applications》论文翻译个人笔记

    联邦学习笔记-<Federated Machine Learning: Concept and Applications>论文翻译个人笔记 摘要 今天的人工智能仍然面临着两大挑战.一是在大 ...

  6. [木野狐]ViewState 剖析(翻译兼笔记)

    [木野狐]ViewState 剖析(翻译兼笔记) 原文链接:ViewState: All You Wanted to Know 作者:Paul Wilson翻译:木野狐 ViewState 不是什么? ...

  7. A Survey of Deep Learning-based Object Detection论文翻译 + 阅读笔记

    A Survey of Deep Learning-based Object Detection论文翻译 + 阅读笔记 //2022.1.7 日下午16:00开始阅读 双阶段检测器示意图 单阶段检测器 ...

  8. 干货分享:高效办公工具【视频转文字、视频播放器、B站视频下载软件、贴图、截图提取文字并翻译、笔记记录软件、任务管理网站】

    高效办公工具分享--视频转文字.视频播放器.B站视频下载软件.贴图.截图提取文字并翻译.笔记记录软件.任务管理网站 一 前言 二.下载链接及效果 1.视频自动转文字-飞书妙记(目前免费使用!!) 2. ...

  9. 区块链分片:《Monoxide: Scale Out Blockchain with Asynchronous Consensus Zones》论文翻译个人笔记

    区块链分片:<Monoxide: Scale Out Blockchain with Asynchronous Consensus Zones>论文翻译个人笔记 日期:2019年2月26- ...

最新文章

  1. Linux服务器架设之时间同步服务器
  2. php 日历 代码,PHP 简单日历实现代码
  3. poj1743 Musical Theme
  4. 实用的it知识学习_怎样能更快更好的学习好书法?分享一些比较实用的理论知识...
  5. Java的for-each循环
  6. linux cp通同时新建目录_Linux 新手应该知道的 26 个命令
  7. 【Java基本功】一文读懂final关键字的用法
  8. GPS拓展无线同步模块GSYN1000系列在广域同步测量的应用方案
  9. java和eova的关系_eova ,一套jfinal开发框架,方便学习与 Jsp/Servlet 262万源代码下载- www.pudn.com...
  10. 小米蓝牙耳机不能串联问题解决
  11. 【20考研】考研数学 复习书籍推荐!
  12. _initialize() 区别 __construct()
  13. 基于Java+SpringBoot+Thymeleaf+Mysql在线电影院选座订票系统设计与实现
  14. RSA中 底数m和模数 n 不互素是仍然成立
  15. 自动化测试报告发送--飞书(基于python)
  16. vmware中linux连接不上wifi
  17. error:jump to case label [-fpermissive]
  18. Python基础 笔记(三) 标识符、输入输出函数
  19. fluent日志文件提交服务器计算,利用云服务器计算fluent
  20. 新生研讨课作业 程序框图

热门文章

  1. 语义分割源代码_综述 | 基于深度学习的实时语义分割方法:全面调研
  2. Pure 天气(Android),Pure天气(hanjie.app.pureweather) - 8.5.5 - 应用 - 酷安
  3. java 数据库 空值_java – 是否可以将枚举属性的空值存储到数据库?
  4. oracle导入dmp报无效的sql,oracle施用pl/sql导入数据库备份文件dmp导入失败原因
  5. Office2019完美配置mathtype7.4
  6. 【SRIO】2、RapidIO串行物理层的包与控制符号
  7. RS232 波特率时钟产生方法?
  8. 模拟信号与离散信号之间的频率关系(由模拟信号采样得到的离散信号)
  9. omnidb数据库web管理工具安装
  10. oracle完全删除实例