0Pricing
Scala for Backend Engineering & Functional Programming · 课时

Akka Actor 模型基础

了解 Actor 模型的原则、Actor 生命周期,以及并发执行中的消息传递。

Akka Actor 模型基础 是 CoddyKit 上的免费 Scala for Backend Engineering & Functional Programming 课时。 这是第 1 节课,共 3 节。 你可以在下方免费阅读本课时的完整内容 — 然后在浏览器中使用内置代码编辑器和全天候 AI 导师进行实践。 这是 Scala for Backend Engineering & Functional Programming 学习路径的一部分,你的进度在网页和 CoddyKit 应用中同步。 Scala for Backend Engineering & Functional Programming 课程共包含 3 节课。

应对并发挑战

在现代应用中,任务通常需要同时运行,这称为并发。并发功能强大,但也会带来一些挑战。

  • 竞态条件:多个线程同时尝试访问和修改共享数据,从而导致不可预测的结果。
  • 死锁:两个或多个线程被永久阻塞,彼此等待对方释放资源。

处理这些问题时,传统的线程模型可能复杂且容易出错。

理解 Actor 模型

Actor 模型提供了一种管理并发的强大方式。Actor 不共享内存,而只通过相互发送消息进行通信。

  • 隔离:每个 Actor 都有自己的私有状态,其他 Actor 无法直接访问。
  • 消息传递:Actor 通过向彼此的邮箱发送不可变消息进行交互。
  • 异步:发送消息不会阻塞;发送方无需等待回复。

您可以把 Actor 想象成彼此独立的人,每个人都有自己的办公桌(状态)和邮政服务(消息传递)。

为什么选择 Akka?

Akka 是一个开源工具包,它将 Actor 模型带到了 Scala(以及 Java)中。它专为构建高并发、分布式且容错的应用而设计。

  • 简单性:Akka 通过抽象底层线程细节,简化并发编程。
  • 可扩展性:可以轻松地将应用从单台机器扩展到机器集群。
  • 弹性:内置故障处理机制,使系统能够自我修复。

即使在高负载或部分故障的情况下,Akka 也能帮助您编写“能够正常运行”的系统。

Akka Actor 内部

Akka Actor 是并发的基本单位。每个 Actor 都具有:

  • 行为:由它对消息的响应方式定义。
  • 邮箱:用于排队接收到的消息。消息会按顺序逐条处理。
  • 私有状态:完全属于该 Actor 的数据,只能由 Actor 自身修改。
  • ActorRef:用于向该 Actor 发送消息的唯一地址。

这种严格的隔离可以避免竞态条件等常见并发错误。

您的第一个 ActorSystem

在创建 Actor 之前,您需要一个 ActorSystem。它是 Akka 的入口点,负责管理其范围内的所有 Actor。

它提供调度、配置以及监督层次结构等服务(我们将在稍后介绍监督)。

尝试创建一个:

import akka.actor.ActorSystem

object Main extends App {
  // Create an ActorSystem
  val system = ActorSystem("MyActorSystem")
  println(s"ActorSystem created: ${system.name}")

  // Terminate the system when done (important for clean shutdown)
  system.terminate()
}

创建您的第一个 Actor

要创建 Actor,您需要定义一个继承 Akka Actor 特征的类,并实现 receive 方法。

receive 方法定义了 Actor 如何处理接收到的消息。它是一个用于匹配消息类型的偏函数。

import akka.actor.Actor

class GreeterActor extends Actor {
  def receive: Receive = {
    case message: String =>
      println(s"Greeter received: $message")
  }
}

生成 Actor 和 ActorRef

使用 ActorSystem 的 actorOf 方法可以创建(或“生成”)Actor。该方法会返回一个 ActorRef。

ActorRef 是指向 Actor 的轻量级可序列化句柄。您可以使用它向该 Actor 发送消息,但不会直接与 Actor 实例交互。

import akka.actor.{ActorSystem, Props, Actor}

class GreeterActor extends Actor {
  def receive: Receive = {
    case message: String =>
      println(s"Greeter received: $message")
  }
}

object Main extends App {
  val system = ActorSystem("MyActorSystem")

  // Create an actor and get its ActorRef
  val greeterRef = system.actorOf(Props[GreeterActor], "greeter")
  println(s"Greeter actor created with path: ${greeterRef.path}")

  system.terminate()
}

向 Actor 发送消息

Actor 之间只能通过消息进行通信。您可以使用 !(告知)运算符向 ActorRef 发送消息。

消息会以异步方式发送,通常是不可变的样例类,或像 String 这样的简单类型。

import akka.actor.{ActorSystem, Props, Actor}

class GreeterActor extends Actor {
  def receive: Receive = {
    case message: String =>
      println(s"Greeter received: $message")
  }
}

object Main extends App {
  val system = ActorSystem("MyActorSystem")

  val greeterRef = system.actorOf(Props[GreeterActor], "greeter")

  // Send a message to the greeter actor
  greeterRef ! "Hello Akka!"
  greeterRef ! "How are you?"

  // Give actors time to process messages before terminating
  Thread.sleep(100)
  system.terminate()
}

Actor 生命周期基础

Actor 具有从创建到终止的生命周期。Akka 提供了一些钩子,供您执行初始化和清理操作:

  • preStart():在 Actor 开始处理第一条消息前立即调用。适合用于初始化资源。
  • postStop():在 Actor 停止后、从系统中完全移除前调用。适合用于释放资源。

理解生命周期对于有效管理 Actor 资源至关重要。

Actor 层次结构

Actor 按层次结构组织,类似于文件系统。除了“根守护者”Actor 之外,每个 Actor 都有一个父级。

  • 监管:父 Actor 负责监管其子 Actor。如果子 Actor 失败,父 Actor 将决定如何处理该失败(例如重启或停止)。
  • 路径:每个 Actor 都有唯一的路径,例如 /user/myActor/childActor,该路径反映了它在层次结构中的位置。

这一层次结构是 Akka 容错和弹性功能的关键。

Akka 基础知识检查

让我们测试一下您对 Akka Actor 模型基础知识的理解。

回顾:Akka Actor 模型

做得很好!在本课中,您已经学习了 Akka Actor 模型的基本概念:

  • 传统并发所面临的挑战。
  • Actor 模型的原则:隔离、消息传递和无共享状态。
  • Akka 作为构建可靠 Actor 系统的工具包所发挥的作用。
  • 如何在 Scala 中定义 ActorSystem 和简单的 Actor。
  • 如何创建 Actor,以及如何使用 ActorRef 向其发送消息。
  • Actor 生命周期和层次结构的基础知识。

接下来,我们将深入了解 Actor 系统的设计,以及如何处理更复杂的交互!

常见问题解答

「Akka Actor 模型基础」课时是免费的吗?

是的 — 「Akka Actor 模型基础」的完整文本可在网页上免费阅读。要进行交互式练习(内置代码编辑器和全天候 AI 导师)并解锁 Scala for Backend Engineering & Functional Programming 课程的其余内容,请升级到 CoddyKit PRO。 Scala for Backend Engineering & Functional Programming 课程共包含 3 节课。

「Akka Actor 模型基础」这节课中我会学到什么?

了解 Actor 模型的原则、Actor 生命周期,以及并发执行中的消息传递。 你通过在浏览器中直接运行的动手代码来练习 Scala for Backend Engineering & Functional Programming,全天候 AI 导师会在你学习这节课的过程中回答你的问题。

学习 Scala for Backend Engineering & Functional Programming 需要有经验吗?

无需任何先前经验。CoddyKit 上的 Scala for Backend Engineering & Functional Programming 课程适合初学者到高级学习者,你可以从这里开始或从头开始,按照自己的节奏学习。 这是第 1 节课,共 3 节。

「Akka Actor 模型基础」课时需要多长时间?

大多数 CoddyKit 课程大约需要 5–10 分钟。每节课都很精短且互动,所以你能稳步进步,并在网页和应用中从离开的地方继续。

我能在这节 Scala for Backend Engineering & Functional Programming 课中编写并运行代码吗?

能。每节 Scala for Backend Engineering & Functional Programming 课都包含内置代码编辑器,你可以在浏览器中直接编写并运行真实代码,并获得即时 AI 反馈 — 无需本地设置。

此课程中的所有课时

  1. Akka Actor 模型基础
  2. 设计 Actor 系统
  3. 监管与容错
← 返回 Scala for Backend Engineering & Functional Programming