Как ответить
Concurrency-модель — это набор правил, по которым параллельные вычисления обмениваются данными и синхронизируются. Модель акторов — одна из таких моделей, где базовым элементом выступает актор — независимый объект с собственным состоянием и почтовым ящиком. Акторы общаются только через асинхронные сообщения, не разделяя память. Это позволяет строить отказоустойчивые и масштабируемые системы.
Основные принципы модели акторов:
- Каждый актор обрабатывает сообщения последовательно, одно за другим. Состояние меняется только при обработке.
- Акторы могут создавать других акторов, отправлять им сообщения и менять своё поведение (например, переключаться между обработчиками).
- Отсутствие общей памяти устраняет необходимость в блокировках, что упрощает параллелизм и избавляет от гонок данных.
- Ошибки изолированы: если актор упал, его супервизор может перезапустить или остановить.
На практике модель используется в Erlang (OTP), Akka (JVM), Orleans (.NET). В Erlang каждый процесс — это актор, а супервизоры перезапускают упавшие акторы. В Akka акторы легковесны, система может запускать миллионы акторов на одной JVM. Пример простого актора на псевдокоде:
actor Counter {
var count = 0
handle Increment => count += 1
handle Get => sender ! count
}Этот актор инкапсулирует счётчик и обрабатывает два типа сообщений. Состояние не видно извне, доступ к нему — только через сообщения. Модель акторов хорошо подходит для распределённых систем: акторы могут быть расположены на разных узлах, а сообщения передаются по сети. Однако нужно учитывать сложности с гарантиями доставки и порядком сообщений — часто используют at-most-once или at-least-once в комбинации с идемпотентностью.