学习 Akka(一):Actor 模型

Akka 是一个 Java/Scala 的 Actor 并发模型实现,它借鉴了 Erlang 的 Actor 并发模型,并添加了许多新的特性来构建分布式系统。

Actor 模型

不同于面向对象语言,可以访问对象的字段执行对象的方法,Actor 与外部世界通讯的唯一方式就是消息传递。

actor_model

下面介绍 Actor 模型的几个概念:

  • Actor 并发原始的的 worker,来异步处理消息。Actor 可以维护状态,该状态可以改变。
  • Message 用于与进程通讯的数据。
  • MailBox 消息被存储的地方,直到消息被处理。可以看作是消息的队列。

Actor 模型的好处:

  1. 非常易于并行化,每个 worker 都有自己的任务。
  2. 杜绝了共享状态。

Actor 生命周期

actor_lefecycle

注意:只有重启 Actor 的时候, preRestartpostRestart 才会被调用

监督(Supervision)与错误容忍(Fault tolerance)

监督或多或少是把对错误进行响应的责任移到了发生错误的事物外面。

Action 可以有子 Actor,父 Actor 对子 Actor 有监督的责任,父 Actor 监控子 Actor 的错误并根据监督策略执行动作。

体系

Actor 系统的顶端的路径为 /

使用 actorSystem.actorOf() 创建的 Actor 路径为 /user/parent

在 Actor 内部,使用 context().actorOf() 创建的 Actor 路径为 /user/parent/child

另外,系统的 Actor 路径为 /system,临时的 Actor 路径为 /temp

actor_hierarchy

策略

Actor 监督策略支持的动作:

  • Resume 继续
  • Stop 停止
  • Restart 重启
  • Escalate 扩散

默认情况下的监督策略:

  • 运行中的 Actor 发生异常:restart
  • 运行中的 Actor 发生错误:escalate
  • Actor 初始化发生异常:stop

supervisor

分布式与位置透明

Akka 扩展了 Erlang 的 actor 模型,打破了 actor 系统的物理隔阂。

Akka 添加了远程处理和位置透明,这样,actor 的 mailbox 可以在远端的机器上,并且 Akka 抽象出了通过网络传输 message。