Серия Akka (1): Введение в Akka и модель актера

задняя часть робот Scala Akka

Akka — это среда параллелизма, построенная на JVM и основанная на модели Actor, которая является лучшей платформой для создания масштабируемых и эластичных параллельных приложений. Эта статья в основном представляет собой личное понимание обучения и применения Akka.

Модель актера

Ядром Akka является Актер, поэтому я должен сказать Актер, Модель Актера, позвольте мне привести популярный пример, предполагая, что два человека в действительности знают только адрес друг друга, они хотят общаться и отправлять информацию друг другу, но они у вас нет мобильного телефона, телефона, интернета и других каналов, поэтому они могут отправлять сообщения только письмом, как настоящая почтовая система, если вы хотите отправить письмо, вам нужно только отправить письмо в соответствующий почтовый ящик в зависимости от адреса вам не нужно знать, как он обрабатывает доставку для вас, и вы также можете получить ответ от получателя, который эквивалентен отзыву сообщения. Буква в приведенном выше примере эквивалентна сообщению в Актере, а Актер и Актер могут общаться только через сообщение. Конечно, модель Актера намного сложнее.Вот краткое объяснение концепции модели Актера.

Актеры-модели в Акке

  • Более высокая абстракция модели параллелизма
  • Асинхронная, неблокирующая, высокопроизводительная модель программирования, управляемая событиями.
  • Облегченная обработка событий (память 1 ГБ может хранить миллионы Актеров)

Почему акторная модель является решением проблем параллелизма?

Поначалу я не очень хорошо это понимал. У меня в голове было последовательное мышление, что решение проблем параллелизма — это то, как обеспечить согласованность и правильность общих данных. Почему существует такая проблема, как поддержание правильности общих данных? Это не что иное, как то, что наша программа многопоточная, и несколько потоков изменяют одни и те же данные, и если не добавить условия синхронизации, это неизбежно приведет к загрязнению данных. Итак, мы можем изменить свое мышление и использовать один поток для обработки соответствующего запроса, но некоторые люди спросят, если мы используем один поток для обработки, как можно гарантировать производительность системы. Появление модели Актера решает эту проблему.

Обзор модели актера:

Actor模型
Модель актера

Как мы видим из рисунка выше, Актеры и Актеры могут общаться только с сообщениями до этого.Когда Актер отправляет сообщение другому Актеру, сообщения идут в порядке.Вам нужно только отправить сообщение на соответствующий почтовый ящик.Что касается Вас не знаю, как другой Актер воспримет ваше сообщение, и, конечно, вы можете дождаться его ответа.

Актеры в JVM имеют следующие характеристики:

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

На самом деле, только из приведенных выше описаний мы не можем увидеть преимущества Актеров в решении проблем параллелизма.

Но я выделил два момента:Упрощение параллельного программирования,Улучшить производительность программы

1. Упростите параллельное программирование:

В начале мы сказали, что самая большая проблема, вызванная параллелизмом, — это работа с общими данными.Когда мы сталкиваемся с проблемами параллелизма, мы в основном используем
Используйте блокировки для обеспечения непротиворечивости общих данных, но это также порождает другие сопутствующие проблемы, такие как гранулярность блокировок (для методов, программных блоков и т. д.), форма блокировок (блокировки чтения, блокировки записи и т. д.), эти вопросы имеют решающее значение для параллельных программ, но программист, впервые пишущий параллельные программы, часто не может их очень хорошо контролировать, что, несомненно, увеличивает сложность программирования для программистов, и это не простое управление, но использование Актера не вызовет эти проблемы. Прежде всего, функция сообщения Актера чувствует, что не будет проблем с обменом данными при общении с Актером. Кроме того, сообщение обрабатывается последовательно внутри Актера, и это не повлияет на информацию в Актере. Данные вызывают загрязнение, и написание параллельных программ с помощью Актеров, несомненно, значительно упростит кодирование.

2. Улучшить производительность программы:

Мы говорили ранее, что поскольку используется однопоточная обработка, как обеспечить производительность программы? Прежде всего, Актер очень легковесен. В программе можно создать много Актеров, а Актеры асинхронны. Как использовать эту функцию? Что нам нужно сделать, так это разделить соответствующие параллельные события на одно как можно больше. Пусть каждый Актер обрабатывает соответствующие небольшие события и в полной мере использует свои асинхронные характеристики для повышения производительности программы.

На самом деле, родной Актер в Scala не может делать многого, это не полное решение для параллелизма, и он не подходит для производственных сред, таких как восстановление после ошибок, сохранение состояния и т. д., поэтому в более новой версии Библиотека классов Scala, пакет Akka Заменил родной Актер.

Akka

Давайте кратко поговорим об Akka. Как зрелое решение для параллелизма, Akka получило широкое распространение в отрасли, особенно в области финансов и игр. Механизм отказоустойчивости Akka, постоянство, удаленные вызовы, журналы и т. Д. Это очень важный модуль. , и это содержание будет объяснено один за другим в последующих статьях этой серии. Давайте закончим эту статью вводной программой Akka. Теперь предположим, что есть домашний робот, нам нужно только отправить ему сообщение и он сделает за нас соответствующие дела, теперь воспользуемся программой для моделирования такого сценария:Исходная ссылка

В этом примере используется язык Scala, инструмент сборки — SBT, а IDE — IntelliJ IDEA.

1. Сначала создайте проект Scala на основе SBT.

build.sbtКонфигурация:

name := "Example_01"

version := "1.0"

scalaVersion := "2.11.8"

val akkaVersion   = "2.4.16"

libraryDependencies +=
  "com.typesafe.akka" %% "akka-actor" % akkaVersion

2. Определим несколько сообщений:

trait Action{
  val message: String
  val time: Int
}

case class TurnOnLight(time: Int) extends Action {   // 开灯消息
  val message = "Turn on the living room light"
}

case class BoilWater(time: Int) extends Action {   // 烧水消息
  val message = "Burn a pot of water"
}

3. Мы используем Actor для реализации имитации робота:

class RobotActor extends Actor {
  val log = Logging(context.system, this)
  def receive: Receive = { //机器人接受指令
    case t: TurnOnLight => log.info(s"${t.message} after ${t.time} hour")
    case b: BoilWater => log.info(s"${b.message} after ${b.time} hour")
    case _ => log.info("I can not handle this message")
  }
}

4. Протестируем робота:

object Example_01 extends App {
  val actorSyatem = ActorSystem("robot-system") 
  val robotActor = actorSyatem.actorOf(Props(new RobotActor()), "robotActor") //创建一个机器人
  robotActor ! TurnOnLight(1) //给机器人发送一个开灯命令
  robotActor ! BoilWater(2) //给机器人发送一个烧水命令
  robotActor ! "who are you" //给机器人发送一个任意命令
  actorSyatem terminate ()
}

5. Запуск результатов

[INFO] [03/19/2017 13:48:05.622] [robot-system-akka.actor.default-dispatcher-4] [akka://robot-system/user/robotActor] Turn on the living room light after 1 hour
[INFO] [03/19/2017 13:48:05.622] [robot-system-akka.actor.default-dispatcher-4] [akka://robot-system/user/robotActor] Burn a pot of water after 2 hour
[INFO] [03/19/2017 13:48:05.622] [robot-system-akka.actor.default-dispatcher-4] [akka://robot-system/user/robotActor] I can not handle this message

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

Эта статья будет здесь первой, а следующая статья в основном расскажет вам о многоуровневой структуре Актеров в Akka.