博客
关于我
强烈建议你试试无所不能的chatGPT,快点击我
[翻译]AKKA笔记 - CHILD ACTORS与ACTORPATH -6
阅读量:6939 次
发布时间:2019-06-27

本文共 3552 字,大约阅读时间需要 11 分钟。

原文:

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比拟成一个 - 有一个/root目录,还有其他的/etc,/usr,/bin和其他目录。

ActorSystem跟那个差不多。他创建一些顶层Actor - 最重要根Actor就是根目录/, user Actor就是/usrr目录,一个system Actor就是一个/system目录。(还有一个/deadLetters来代表DeadLetterActorRef。我们在里面看到过)

内组合了三个Actor(从)。他们是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 {...

文章来自微信平台「麦芽面包」(微信扫描二维码关注)。未经允许,禁止转载。

这里写图片描述

你可能感兴趣的文章
【CTO讲堂】揭秘高效协作工具背后的技术架构
查看>>
【答疑】对象存储OSS常见问题解答(工具类1)
查看>>
ASP.NET Core使用Jaeger实现分布式追踪
查看>>
RDS数据订阅服务使用说明
查看>>
如何优雅拒绝产品经理的不合理需求
查看>>
快轮刘峰:用天才发明解决城市最后5公里出行问题
查看>>
微服务架构 - 巧妙获取被墙的Docker镜像
查看>>
创新型服务“场景串接”——互联网平台建设
查看>>
鲸仓科技获7500万元B+轮融资,旷视科技领投、百度风投跟投
查看>>
IT专家们谈OpenStack和Kubernetes的未来
查看>>
jQuery Ajax 操作函数及deferred对象
查看>>
Eclipse 开发配置
查看>>
IDEA快捷键快速查看跳转当前类的方法
查看>>
Oracle Internal Event:10200 Consistent Read诊断事件
查看>>
正则表达式校验IP地址
查看>>
Exchange 常见问题之二----5
查看>>
Linux学习网站
查看>>
CentOS防火墙iptables的配置方法详解
查看>>
puppet客户端取消主动更新
查看>>
redis 3.0.7 安装部署
查看>>