Движок cccc1808. ProcessEngine

Версия 1.3 от Alexandr Fokin на 2026/04/10 14:21

Теги поиска

cccc1808. ProcessEngine, cccc1808.ProcessEngine
Очередь задач, Система обработки процессов, Движок обработки процессов.
Процесс

Особенности
Батчинг

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

  • (1 транзакция - 1 процесс),
  • (1 транзакция - N процессов).
Изоляция шагов и процессов
БД провайдер
  • Сейчас есть реализация под EntityFramework.
  • Но модель позволяет сделать реализацию под другие решения (LinqToDb или чистый Ado.Net).
Передача сигналов для процессов через систему триггеров.

В том числе для передачи сигналов реализована система триггеров.
Она позволяет оптимизировать операции с БД.

см. пример 1.

Перехват ошибокПерехват и обработка ошибок, если процесс выкинул exception в движок. Реализацию простого retry с задержкой.
Soft timeoutВозможность указывать soft timeout, который будет мягко приостанавливать цикл (внутри шага процесса), чтобы ограничить общее время транзакции (не делать транзакции долгими (например горизонт postgres)). 
Например родительский процесс может создать N/2 дочерних процессов за 1 сессию и N/2 за 2 сессию выполнения.
Примеры
1Родительский процесс, N дочерних процессов.
  1. Родительский процесс создает триггер со счетчиком N, создает и запускает дочерние процессы, засыпает.
  2. Дочерние процесс при завершении публикует TriggerEvent.
  3. TriggerConsumerRunner периодически считывает батч TriggerEvent, уменьшает считчик триггера и делает запись в БД. За счет агрегации событий завершения процессов мы уменьшаем нагрузку на БД.
  4. Когда все дочерние процессы отработали TriggerConsumerRunner получает значение счетчика 0 и взводит триггер.
  5. Триггер пробуждает родительский процесс для дальнейшего выполнения.
TriggerEvent публикуются без использования TransactionOutbox напрямую в брокер после коммита транзакции (иначе мы бы нагружали БД).

Предполагаем, что основную часть времени система работает стабильно, но допускается ситуация, что транзакция закоммитилась, но TriggerEvent не смогли опубликоваться (остановка сервиса без graceful shutdown, проблемы соединения или работы с брокером сообщений.

Для таких случаев создается страхующий триггер (1 общий на тип процесса). Этот триггер запускается периодически и проходится по всем ожидающим процессам, проверяя условие (в реализации можно использовать keyset пагинацию) (в реализации можно использовать join для проверки условия).
Этот триггер выполняется периодически с более крупной временной задержкой. В случае обнаружения потери TriggerEvent, он поднимет заклинивший родительский процесс и он будет обработан (но позже). Можно установить этому триггеру низкий приоритет.