Открыть сервис

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

Модель акторов — это математическая модель вычислений, в которой базовыми единицами исполнения являются акторы, взаимодействующие исключительно посредством асинхронной передачи сообщений. В отличие от классических моделей параллелизма, основанных на разделяемой памяти и блокировках, модель акторов предполагает, что каждый актор обладает собственным состоянием, которое может быть изменено только им самим. Модель была предложена в 1973 году Карлом Хьюиттом, Питером Бишопом и Ричардом Стейгером как теоретическая основа для построения высоконадёжных распределённых систем.

История возникновения

Предпосылки и первые публикации

В начале 1970-х годов развитие вычислительной техники привело к необходимости создания эффективных способов организации параллельных вычислений. Существовавшие на тот момент модели, такие как потоки и процессы, опирались на разделяемую память, что порождало проблемы синхронизации, взаимных блокировок и гонок данных. В 1973 году в статье «A Universal Modular ACTOR Formalism for Artificial Intelligence» Карл Хьюитт и его коллеги впервые формализовали модель акторов. Изначально она разрабатывалась для задач искусственного интеллекта, где требовалось моделировать сложные системы с множеством независимых агентов.

Развитие в 1980–1990-е годы

В 1980-е годы модель акторов получила дальнейшее теоретическое обоснование. В 1985 году Гул Ага в своей диссертации «Actors: A Model of Concurrent Computation in Distributed Systems» представил формальную семантику модели, включая правила обработки сообщений и создания новых акторов. В 1990-е годы интерес к модели возрос в связи с развитием распределённых вычислений и интернета. Были разработаны первые языки программирования, реализующие модель акторов, такие как Erlang (создан в 1986 году, но широкое распространение получил в 1990-е). Erlang, разработанный в компании Ericsson для телекоммуникационных систем, стал одним из первых промышленных примеров успешного применения модели акторов.

Современный этап

С начала 2000-х годов модель акторов стала активно использоваться в разработке высоконагруженных и отказоустойчивых систем. В 2009 году компания Typesafe (ныне Lightbend) представила фреймворк Akka для языка Scala, реализующий модель акторов на платформе Java Virtual Machine (JVM). В 2010-е годы появились реализации модели в других языках, включая C# (Orleans от Microsoft), Python (Thespian, Pykka), JavaScript (CSP, библиотеки для акторов) и Rust (Actix). В 2015 году компания Microsoft Research разработала язык программирования P#, ориентированный на построение распределённых систем на основе модели акторов.

Основные принципы модели

Модель акторов базируется на трёх фундаментальных правилах, определяющих поведение акторов:

  1. Асинхронная передача сообщений — акторы общаются исключительно путём отправки сообщений. Отправка сообщения не блокирует отправителя, и актор может продолжать выполнение, не дожидаясь ответа.
  2. Изоляция состояния — каждый актор имеет собственное внутреннее состояние, которое недоступно другим акторам напрямую. Изменение состояния возможно только внутри актора при обработке полученного сообщения.
  3. Атомарная обработка сообщений — актор обрабатывает сообщения последовательно, одно за другим. В каждый момент времени актор занят обработкой не более одного сообщения, что исключает гонки данных.

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

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

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

Адресация и идентификация

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

Классификация акторов

По роли в системе

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

По способу обработки сообщений

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

По масштабу

  • Локальные акторы — работают в пределах одного процесса или узла.
  • Удалённые акторы — могут находиться на разных узлах сети, обмениваясь сообщениями через сетевые протоколы (например, через TCP или HTTP).

Реализации модели акторов

Языки программирования

  • Erlang — один из первых языков, полностью реализующих модель акторов. В Erlang акторы называются процессами, а обмен сообщениями осуществляется через почтовые ящики. Язык используется в телекоммуникационных системах, мессенджерах (WhatsApp, Telegram) и распределённых базах данных.
  • Scala (Akka) — фреймворк Akka реализует модель акторов на платформе JVM. Поддерживает как локальные, так и удалённые акторы, кластеризацию, устойчивость к сбоям (супервизорная иерархия).
  • C# (Orleans) — фреймворк Orleans от Microsoft использует концепцию «виртуальных акторов» (grains), которые автоматически активируются при получении сообщений и деактивируются при простое.
  • Rust (Actix) — библиотека Actix предоставляет высокопроизводительную реализацию модели акторов для языка Rust. Используется в веб-серверах и высоконагруженных сетевых приложениях.
  • Python (Pykka, Thespian) — библиотеки для реализации акторов в Python, обычно используются в прототипировании и небольших проектах.

Промышленные системы

  • **WhatsApp (продукт Meta, признанной экстремистской и запрещённой в РФ)** — серверная часть мессенджера написана на Erlang и использует модель акторов для обработки миллионов одновременных подключений.
  • Apache Flinkсистема потоковой обработки данных использует модель акторов для управления состоянием и координации задач.
  • Telegram — серверная часть также использует Erlang, что обеспечивает высокую надёжность и отказоустойчивость.
  • Microsoft Orleans — используется в облачных сервисах Microsoft, таких как Azure, для построения масштабируемых приложений.

Преимущества и недостатки

Преимущества

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

Недостатки

  • Сложность отладки — асинхронная природа взаимодействия и распределённость акторов затрудняют воспроизведение и анализ ошибок. Традиционные отладчики, работающие с последовательным кодом, часто неприменимы.
  • Накладные расходы на сообщения — каждое сообщение требует сериализации, передачи и десериализации, что может приводить к задержкам и дополнительным затратам памяти.
  • Отсутствие гарантий доставки — в базовой модели акторов не гарантируется, что сообщение будет доставлено в порядке отправки или вообще будет доставлено (если актор-получатель уничтожен). Для обеспечения гарантий требуются дополнительные механизмы (например, подтверждения получения).
  • Сложность проектирования — разработка системы на основе акторов требует иного подхода к проектированию, чем традиционные объектно-ориентированные или функциональные программы. Необходимо тщательно продумывать топологию взаимодействия и обработку ошибок.

Применение

Телекоммуникационные системы

Модель акторов широко используется в телекоммуникациях, где требуется обработка миллионов параллельных соединений. Например, в системе управления вызовами (Call Control) каждый вызов может быть представлен отдельным актором, что позволяет легко масштабировать систему.

Распределённые базы данных

Некоторые распределённые базы данных, такие как Riak и Apache Cassandra, используют модель акторов для управления репликацией и координацией узлов. Каждый узел может быть представлен актором, обрабатывающим запросы на чтение и запись.

Веб-серверы и API

Фреймворки, реализующие модель акторов (например, Akka HTTP), позволяют строить высокопроизводительные веб-серверы, способные обрабатывать десятки тысяч запросов в секунду. Каждый запрос может быть обработан отдельным актором, что обеспечивает изоляцию и отказоустойчивость.

Игровые серверы

В многопользовательских онлайн-играх каждый игрок может быть представлен актором, а игровые события — сообщениями. Это позволяет легко управлять состоянием игроков и обрабатывать события в реальном времени.

Интернет вещей (IoT)

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

Критика

Модель акторов подвергается критике за отсутствие формальных гарантий доставки сообщений и порядка их обработки. В некоторых реализациях (например, в Akka) гарантируется только «максимум один раз» (at-most-once) доставка, что может быть неприемлемо для систем, требующих строгой согласованности данных. Кроме того, модель акторов не предоставляет встроенных механизмов для обработки транзакций, что усложняет построение систем, требующих атомарности операций.

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

См. также

Источники

  • Hewitt, C., Bishop, P., Steiger, R. «A Universal Modular ACTOR Formalism for Artificial Intelligence». — 1973.
  • Agha, G. «Actors: A Model of Concurrent Computation in Distributed Systems». — MIT Press, 1986.
  • Armstrong, J. «Programming Erlang: Software for a Concurrent World». — Pragmatic Bookshelf, 2007.
  • Roestenburg, R., Bakker, R., Williams, R. «Akka in Action». — Manning Publications, 2016.
  • Microsoft Research. «Orleans: Distributed Virtual Actors for Programmability and Scalability». — 2015.

BFOmetr — база данных и аналитика по компаниям России.

На главную BFOmetr →