Active Object

опубликовано: ⏰ 12

В этой статье описана одна из реализаций шаблона Active Object, которая упрощает управление асинхронными операциями.

Что такое Active Object?

Шаблон Active Object разделяет выполнение метода и вызов метода для объектов, каждый из которых находится в своем собственном потоке управления (Источник). Такое разделение позволяет вызывать методы асинхронно, что в теории может помочь улучшить отзывчивость и масштабируемость приложений.

Основные компоненты:

  1. Proxy/Interface – действует как интерфейс к Active Object. Он получает вызовы методов и ставит их в очередь.
  2. Scheduler/Dispatcher – управляет порядком выполнения поставленных в очередь запросов.
  3. Servant/Object Implementation – содержит фактическую реализацию методов. Он выполняет запросы в своем собственном потоке.
  4. Request Queue – хранит очередь запросов до тех пор, пока они не будут обработаны Servant.
  5. Messages/Events – инкапсулируют вызовы методов и их параметры, позволяя ставить их в очередь и обрабатывать.

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

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

Примеры использования:

  • Неблокирующие запросы – выполнение длительных запросов состояния объекта или вызов его операций без влияния на основной поток приложения.
  • Цепочка вызовов – возможность создавать последовательную цепочку неблокирующих вызовов к нескольким объектам.

Реализация

Эта реализация очень специфична для следующих целей:

  • Асинхронные вызовы методов – методы выполняются асинхронно, позволяя вызывающему объекту продолжать выполнять другие задачи.
  • Потокобезопасная обработка – гарантирует, что вызовы методов являются потокобезопасными и не мешают друг другу.
  • Управление очередью запросов – эффективно управляет очередью запросов, чтобы гарантировать, что запросы обрабатываются в правильном порядке.
  • Управление зависимостями – обеспечивает строгий контроль зависимостей между объектами.
  • Настраиваемые жизненные циклы – позволяет настраивать жизненные циклы объектов, включая инициализацию и завершение.
  • Единый диспетчер – использует один диспетчер для управления всеми активными объектами.
  • Высокая скорость обработки – обеспечивает высокую скорость обработки сообщений.

Управление жизненным циклом:

Lifecycle Diagram

Примеры использования

Usage 1

  • User Interface – обеспечивает доступ к таблице данных из пользовательского интерфейса.
  • Data Table – представляет собой таблицу данных, которая может находиться в разных состояниях (например, миграция, создание, удаление и т. д.). Зависит от Data Source.
  • Data Source – представляет источник данных, который может находиться в разных состояниях (например, создание, подключение, закрытие и т. д.). Зависит от Data Table и взаимодействует с внешними ресурсами, такими как базы данных или файловые системы.

Data Table и Data Source являются активными объектами, которые могут находиться в разных состояниях. Основная проблема, которую нам нужно решить, заключается в том, как управлять их жизненными циклами и зависимостями, обеспечивая правильную инициализацию Data Source перед использованием Data Table.

Более сложный пример с конвейером ETL:

Usage 2

  • User Interface – обеспечивает доступ к конвейеру из пользовательского интерфейса.
  • Pipeline – представляет конвейер обработки данных, который может находиться в разных состояниях (например, запущен, приостановлен, остановлен и т. д.). Зависит от Source Endpoint, Transformer и Target Endpoint.
  • Source Endpoint – представляет исходную конечную точку, которая может находиться в разных состояниях (например, подключается, подключен, отключен и т. д.). Взаимодействует с внешними ресурсами, такими как базы данных или файловые системы.
  • Transformer – представляет преобразователь, который может находиться в разных состояниях (например, обработка, останавливается, остановлен и т. д.). Зависит от внутренних скриптов или служб.
  • Target Endpoint – представляет целевую конечную точку, которая может находиться в разных состояниях (например, подключается, подключен, отключен и т. д.). Он взаимодействует с внешними ресурсами, такими как базы данных или файловые системы.

Pipeline, Source Endpoint, Transformer и Target Endpoint являются активными объектами.

Исходный код

dev // actO

Acto Programming Concurrency Design-Patterns Devmix