Scala for Backend Engineering & Functional Programming · Урок

Основы акторной модели Akka

Изучите принципы акторной модели, жизненный цикл акторов и обмен сообщениями для параллельного выполнения.

Урок 1 из 312 шагов

«Основы акторной модели Akka» — бесплатный урок Scala for Backend Engineering & Functional Programming на CoddyKit. Это урок 1 из 3. Ты можешь прочитать весь урок бесплатно ниже — а потом практиковать его прямо в браузере с встроенным редактором кода и ИИ-репетитором 24/7. Это часть пути обучения Scala for Backend Engineering & Functional Programming, и твой прогресс синхронизируется между веб-версией и приложением CoddyKit. Курс Scala for Backend Engineering & Functional Programming содержит 3 уроков всего.

Решение проблем конкурентного выполнения

В современных приложениях задачи часто должны выполняться одновременно. Это называется конкурентным выполнением. Несмотря на свои преимущества, конкурентное выполнение связано с определёнными трудностями.

  • Состояния гонки: возникают, когда несколько потоков одновременно пытаются получить доступ к общим данным и изменить их, что приводит к непредсказуемым результатам.
  • Взаимные блокировки: возникают, когда два или более потока бесконечно заблокированы и ждут, пока друг друга освободят ресурсы.

Традиционные модели работы с потоками могут быть сложными и приводить к ошибкам при решении таких проблем.

Изучение модели акторов

Модель акторов предоставляет эффективный способ управления конкурентным выполнением. Вместо совместного использования памяти акторы взаимодействуют только посредством отправки сообщений друг другу.

  • Изоляция: у каждого актора есть собственное состояние, к которому никакой другой актор не может получить прямой доступ.
  • Передача сообщений: акторы взаимодействуют, отправляя неизменяемые сообщения в почтовые ящики друг друга.
  • Асинхронность: отправка сообщений не блокирует выполнение; отправитель не ждёт ответа.

Представьте акторов как независимых людей: у каждого есть собственный стол (состояние) и почтовая служба (передача сообщений).

Почему стоит выбрать Akka

Akka — это набор инструментов с открытым исходным кодом, реализующий модель акторов в Scala (и Java). Он предназначен для создания высококонкурентных, распределённых и отказоустойчивых приложений.

  • Простота: Akka упрощает конкурентное программирование, скрывая низкоуровневые детали работы с потоками.
  • Масштабируемость: приложения легко масштабируются от одного компьютера до кластера компьютеров.
  • Устойчивость: встроенные механизмы обработки сбоев позволяют системам восстанавливаться самостоятельно.

Akka помогает создавать системы, которые «просто работают» даже при высокой нагрузке или частичных сбоях.

Устройство актора Akka

Актор Akka — это базовая единица конкурентного выполнения. У каждого актора есть:

  • Поведение: определяется тем, как он реагирует на сообщения.
  • Почтовый ящик: сюда помещаются входящие сообщения. Сообщения обрабатываются по одному и по порядку.
  • Приватное состояние: данные, принадлежащие только этому актору и изменяемые исключительно самим актором.
  • ActorRef: уникальный адрес для отправки сообщений этому актору.

Такая строгая изоляция предотвращает распространённые ошибки конкурентного выполнения, например состояния гонки.

Ваша первая ActorSystem

Прежде чем создавать акторов, необходимо создать ActorSystem. Это точка входа в Akka, управляющая всеми акторами в своей области действия.

Она предоставляет такие службы, как планирование, настройка и иерархия надзора (её мы рассмотрим позже).

Попробуйте создать её:

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 Akka, и реализуйте метод receive.

Метод receive определяет, как Ваш актор обрабатывает входящие сообщения. Это частичная функция, сопоставляющая типы сообщений.

import akka.actor.Actor

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

Создание акторов и ActorRef

Акторы создаются (или «порождаются») с помощью метода actorOf объекта ActorSystem. Этот метод возвращает ActorRef.

ActorRef — это лёгкий сериализуемый дескриптор актора. Вы используете его для отправки сообщений этому актору, не взаимодействуя напрямую с самим экземпляром актора.

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()
}

Отправка сообщений акторам

Обмен данными между акторами происходит исключительно посредством сообщений. Сообщения отправляются в ActorRef с помощью оператора ! (tell).

Сообщения отправляются асинхронно и обычно представляют собой неизменяемые классы вариантов или простые типы, такие как 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()
}

Основы жизненного цикла акторов

У акторов есть жизненный цикл: от создания до завершения. Akka предоставляет хуки, с помощью которых можно выполнять действия по настройке и очистке:

  • preStart(): вызывается непосредственно перед тем, как актор начинает обрабатывать первое сообщение. Полезен для инициализации ресурсов.
  • postStop(): вызывается после остановки актора и перед его полным удалением из системы. Полезен для освобождения ресурсов.

Понимание жизненного цикла крайне важно для эффективного управления ресурсами акторов.

Иерархии акторов

Акторы организованы в иерархию, подобную файловой системе. У каждого актора, кроме актора «корневого стража», есть родитель.

  • Надзор: Родительские акторы отвечают за надзор над дочерними. Если дочерний актор завершается с ошибкой, его родитель решает, как обработать эту ошибку (например, перезапустить или остановить его).
  • Путь: У каждого актора есть уникальный путь, например /user/myActor/childActor, отражающий его положение в иерархии.

Эта иерархия лежит в основе возможностей Akka по отказоустойчивости и устойчивости к сбоям.

Проверка основ Akka

Проверим, насколько хорошо Вы понимаете основы модели акторов Akka.

Повторение: модель акторов Akka

Отличная работа! В этом уроке Вы изучили основные понятия модели акторов Akka:

  • Проблемы традиционной параллельности.
  • Принципы модели акторов: изоляция, обмен сообщениями и отсутствие общего состояния.
  • Роль Akka как набора инструментов для создания надёжных систем акторов.
  • Определение ActorSystem и простых акторов в Scala.
  • Создание акторов и отправка им сообщений с помощью ActorRef.
  • Основы жизненного цикла и иерархии акторов.

Далее мы подробнее рассмотрим проектирование систем акторов и обработку более сложных взаимодействий!

Можно начать бесплатно

Изучай Scala с ИИ-репетитором — бесплатно

Пиши и запускай код прямо в браузере, получай мгновенную помощь от ИИ-репетитора 24/7 и продолжи учиться на сайте или в приложении.

Курсы
39
Уроки
143

Часто задаваемые вопросы

Урок «Основы акторной модели Akka» бесплатный?

Да — полный текст урока «Основы акторной модели Akka» бесплатно доступен здесь в веб-версии. Чтобы практиковать его интерактивно (встроенный редактор кода и ИИ-репетитор 24/7) и разблокировать остальной курс Scala for Backend Engineering & Functional Programming, подпишись на CoddyKit PRO. Курс Scala for Backend Engineering & Functional Programming содержит 3 уроков всего.

Чему я научусь в уроке «Основы акторной модели Akka»?

Изучите принципы акторной модели, жизненный цикл акторов и обмен сообщениями для параллельного выполнения. Ты практикуешь Scala for Backend Engineering & Functional Programming с помощью реального кода, который запускаешь прямо в браузере, и ИИ-репетитор 24/7 отвечает на твои вопросы во время урока.

Нужен ли мне опыт, чтобы начать Scala for Backend Engineering & Functional Programming?

Предыдущий опыт не требуется. Scala for Backend Engineering & Functional Programming на CoddyKit структурирован для всех уровней — от новичков до продвинутых, поэтому ты можешь начать отсюда или с самого начала и учиться в своем темпе. Это урок 1 из 3.

Сколько времени занимает урок «Основы акторной модели Akka»?

Большинство уроков CoddyKit занимают около 5–10 минут. Каждый из них компактный и интерактивный, поэтому ты постоянно делаешь прогресс и продолжаешь с того же места в веб-версии и приложении.

Можно ли писать и запускать код в этом уроке Scala for Backend Engineering & Functional Programming?

Да. Каждый урок Scala for Backend Engineering & Functional Programming включает встроенный редактор кода, поэтому ты пишешь и запускаешь реальный код прямо в браузере и получаешь моментальную обратную связь от AI — локальная установка не требуется.

Все уроки этого курса

  1. Основы акторной модели Akka
  2. Проектирование акторных систем
  3. Супервизия и отказоустойчивость
← Назад к Scala for Backend Engineering & Functional Programming