Движок cccc1808. ProcessEngine

Редактировал(а) Alexandr Fokin 2026/04/27 13:28

 
Теги поискаcccc1808. ProcessEngine, cccc1808.ProcessEngine, Process engine
Очередь задач, Система обработки процессов, Движок обработки процессов.
Процесс
ОписаниеУниверсальный движок для выполнения процессов и очередей задач, позволяющий комбинировать несколько подходов к обработке (см особенности).
ТерминыПроцесс является единицей исполнения. В реализации может содержать машину состояний.
Система триггеров используется для таймеров и передачи сигналов для процессов (с оптимизацией нагрузки). 
Репозиторийhttps://github.com/cccc1808/cccc1808.ProcessEngine
Разветывание
База данных

Для надежного хранения данных процессов и триггеров.

  • Сейчас есть реализация под EntityFramework.
  • Но модель позволяет сделать реализацию под другие решения (linq2db или чистый Ado.Net) (за счет наличия IProcessContainer и методов Update).

Для текущей реализации в качестве хранилище может выступать БД, поддерживающая:

  • Транзакции:
    • Транзакции.
    • Savepoint.
      (если используются, можно обрабатывать каждый шаг отдельной транзакцией или весь процесс без savepoint изоляции ошибок между шагами).
  • Блокировки:
    • updatelock.
    • updatelock skip locked.
      (частично можно обойтись без него).
    • sharelock
      (можно обойтись без него без сильного влияния)
  • Уровни изоляции: работает на read committed, то что нужно блокируется руками.
  • Для некоторых кейсов желательно возможность выполнить Upsert (insert on conflict).
Брокер сообщений

Используется для накопления и доставки TriggerEvent.

  • Сейчас есть реализация под Apache Kafka
  • Скорее всего можно сделать под RabbitMq.
  • Если запускать в одном экземпляре, то можно обойтись inmemory реализаций.
Особенности
Пакетные транзакции (батчинг).

Возможность использовать и комбинировать типы выполнения для разных типов процессов:

  • (1 транзакция - 1 процесс),
  • (1 транзакция - N процессов).
Изоляция шагов и процессов (внутри оной транзакции)
  • Изоляция через db savepoint.
  • Для EntityFramework | EntityFrameworkCore возможность делать InMemory снимок Создание снимка ChangeTracker.
  • Допустима реализация на основе того, что InMemory состояние процесса (и задействованных бизнес сущностей) реализовано в виде Immutable компонентов. В этом случае достаточно просто сохранять и восстанавливать ссылку.
    Но предполагаю, что в большинстве бизнес моделей не так и это не не будет востребованным.
Передача сигналов для процессов через систему триггеров.

В том числе для передачи сигналов реализована система триггеров.
Она позволяет оптимизировать операции с БД и уменьшить конкуренцию между процессами за общее состояние (родительский процесс).

См. пример 1.

Stream process

Возможность реализации stream процессов. Которые обрабатываются некоторый поток сообщений.
Через использование триггеров (при поступлении сообщения публикуется TriggerEvent) и системы гарантированного пробуждения (процесс гарантировано не уснет, если есть необработанные сообщения).

См. пример 2.

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

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

В перспективе возможны решения с шардированием.
Soft timeout

Возможность указывать soft timeout, который будет мягко приостанавливать цикл (внутри шага процесса), чтобы ограничить общее время транзакции (не делать транзакции долгими (например горизонт postgres)).

Например:

  1. родительский процесс может создать
    1) N/2 дочерних процессов за первую сессию выполнения (транзакцию)
    2) N/2 за вторую сессию выполнения (транзакцию) и уснуть до окончания дочерних процессов.
  2. Процесс - групповое действие (когда нужно применить действие к строкам таблицы по указанному фильтру).
Range preload process data(Необязательно) возможность в начале сессии обработки пакетно предзагружать данные и бизнес сущности для процессов (Range query) из обрабатываемого батча для оптимизации чтения (если используется обработка пакета процессов в одной транзакции).

Внутренние ссылки:

Дочерние страницы:
Обратные ссылки: