Перейти к содержанию

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

Модель акторов в информатике — это математическая модель параллельных вычислений, в которой «актор» является базовым строительным блоком.

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

Совет

Когда вы запускаете конечный автомат в XState, он становится актором.

Что определяет «актора»?

Акторы — это независимые «живые» объекты, которые могут взаимодействовать друг с другом посредством асинхронной передачи сообщений. В XState мы называем эти сообщения событиями.

  • Актор имеет собственное внутреннее, инкапсулированное состояние, которое может обновляться только самим актором. Актор может обновить своё внутреннее состояние в ответ на полученное сообщение, но оно не может быть обновлено никакой другой сущностью.
  • Акторы общаются с другими акторами, отправляя и получая события асинхронно.
  • Акторы обрабатывают по одному сообщению за раз. Они имеют внутренний «почтовый ящик», который действует как очередь событий, обрабатывая события последовательно.
  • Внутреннее состояние актора не разделяется между акторами. Единственный способ для актора поделиться частью своего внутреннего состояния:
    • Отправка событий другим акторам
    • Или генерация снимков (snapshots), которые можно рассматривать как неявные события, отправляемые подписчикам.
  • Акторы могут создавать (spawn/invoke) новых акторов.

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

Состояние

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

Подробнее об акторах и состоянии в XState.

Коммуникация через события

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

Подробнее о событиях и переходах в XState.

Порождение акторов

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

Модель акторов в бэкенд-разработке

Модель акторов часто используется для координации бэкенд-систем. Существуют прямые реализации модели акторов, такие как Akka для JVM. В Erlang процессы можно рассматривать как акторы, которые могут отправлять и получать сообщения и порождать новые процессы. Erlang используется в крупных распределённых системах, таких как Discord и WhatsApp.

В Stately Sky актор конечного автомата может использоваться для управления длительными бэкенд-процессами, такими как процессы онбординга пациентов, управление инвентарём или многопользовательский совместный опыт, например интерактивные доски или игры.

Модель акторов во фронтенд-разработке

Модель акторов особенно полезна для координации множества движущихся частей фронтенд веб-приложения.

Ваше фронтенд-приложение всегда является распределённой системой, и управление распределёнными системами — это то, в чём модель акторов преуспевает. Это связано с тем, что в браузерной среде у вас никогда нет настоящего «единого источника истины», вместо этого у вас есть множество независимых источников состояния и событий: сторонние компоненты, локальное состояние компонентов, локальное хранилище, параметры запроса, маршрутизаторы, сетевой ввод/вывод, события DOM и их обработчики и т.д.

[…] не существует такого понятия, как единый источник истины в любом нетривиальном приложении. Все приложения, даже фронтенд-приложения, на каком-то уровне являются распределёнными. – из: Redux is Half of a Pattern (2/2)

Так что даже для простых веб-приложений, с небольшим специфичным для приложения состоянием и несколькими известными событиями, модель акторов может быть полезна.

XState

Акторы в XState могут:

  • Принимать сообщения как события, передаваемые в их собственную внутреннюю логику, или для конечных автоматов как получаемые через переходы.
  • Создавать больше акторов внутри конечного автомата, используя spawn в assign, или используя создатель действия spawnChild. Подробнее см. Порождение.
  • Отправлять больше сообщений как события, используя self.send в своей собственной логике, или создатели действий, такие как sendTo или raise в конечном автомате.

Акторы в XState имеют собственную логику актора, которую они используют для:

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

Акторы в XState существуют в системах и могут взаимодействовать друг с другом внутри этих систем и между ними.

Ссылки

Комментарии