Исходный код вики Движок cccc1808. ProcessEngine

Версия 31.28 от Alexandr Fokin на 2026/09/04 13:05

Скрыть последних авторов
Alexandr Fokin 27.16 1 |(% style="width:132px" %) |(% style="width:1301px" %)(((
2 |Теги поиска|cccc1808. ProcessEngine, cccc1808.ProcessEngine, Process engine
Alexandr Fokin 31.27 3 Очередь задач, Система обработки процессов, Движок обработки процессов, Обработка конкурентных сигналов.
Alexandr Fokin 1.2 4 [[Процесс>>doc:Архитектура и модели.Модели.Процесс.WebHome]]
Alexandr Fokin 27.16 5 |Описание|Универсальный движок для выполнения процессов и очередей задач, позволяющий комбинировать несколько подходов к обработке (см особенности).
Alexandr Fokin 31.7 6 |Термины|(((
7 * Процесс является единицей исполнения. В реализации может содержать машину состояний.
Alexandr Fokin 31.22 8 * Система триггеров используется для таймеров и передачи сигналов для процессов (с обработкой конкуренции и с оптимизацией нагрузки).
Alexandr Fokin 31.7 9 )))
Alexandr Fokin 27.16 10 |Репозиторий|[[https:~~/~~/github.com/cccc1808/cccc1808.ProcessEngine>>https://github.com/cccc1808/cccc1808.ProcessEngine]]
Alexandr Fokin 31.7 11 |Некоторые цели|(((
Alexandr Fokin 31.8 12 * Реализация механизмов для эффективной конкурентной передачи сигнала в процесс.
Alexandr Fokin 31.9 13 * Реализация механизмов для минимизации задержки передачи сигнала в процесс.
Alexandr Fokin 31.12 14 * Возможность управлять параметрами, влияющими на Throughput и Latency.
Alexandr Fokin 31.10 15 * Минимизация нагрузки на БД.
Alexandr Fokin 31.24 16 * Наличие общей платформы (абстракций и механик), которая решает широкий спектр задач за счет конфигурации.
Alexandr Fokin 31.28 17 (Уменьшение необходимости изобретать велосипеды), более стабильная оценка времени разработки.
Alexandr Fokin 1.2 18 )))
Alexandr Fokin 31.7 19 )))
Alexandr Fokin 31.4 20 |(% style="width:132px" %)Развертывание|(% style="width:1301px" %)(((
Alexandr Fokin 1.18 21 |(% style="width:150px" %)База данных|(% style="width:1177px" %)(((
22 Для надежного хранения данных процессов и триггеров.
23
Alexandr Fokin 31.5 24 * Есть реализация под [[EntityFramework>>doc:Разработка.NET.Работа с БД.EntityFramework | EntityFrameworkCore.WebHome]].
Alexandr Fokin 31.4 25 * Есть реализация под [[linq2db>>doc:Разработка.NET.Работа с БД.linq2db.WebHome]] (cccc1808/feature/linq2db).
Alexandr Fokin 31.6 26 * Модель позволяет сделать реализацию под другие решения (за счет наличия IProcessContainer и методов Update). В коде процесса может использоваться как ChangeTracker, так и прямое обновление БД.
Alexandr Fokin 1.18 27
28 Для текущей реализации в качестве хранилище может выступать БД, поддерживающая:
29
Alexandr Fokin 27.17 30 * Транзакции:
31 ** Транзакции.
32 ** Savepoint.
Alexandr Fokin 1.41 33 (если используются, можно обрабатывать каждый шаг отдельной транзакцией или весь процесс без savepoint изоляции ошибок между шагами).
Alexandr Fokin 27.17 34 * [[Блокировки>>doc:Разработка.Базы данных.SQL.Механизмы.Транзакции и блокировки.WebHome]]:
35 ** updatelock.
36 ** updatelock skip locked.
Alexandr Fokin 1.41 37 (частично можно обойтись без него).
Alexandr Fokin 27.17 38 ** sharelock
Alexandr Fokin 1.33 39 (можно обойтись без него без сильного влияния)
Alexandr Fokin 27.13 40 * [[Уровни изоляции>>doc:Разработка.Базы данных.SQL.Механизмы.Транзакции и блокировки.Уровни изоляции | Isolation levels.WebHome]]: работает на read committed, то что нужно блокируется руками.
41 * Для некоторых кейсов желательно возможность выполнить [[Upsert>>doc:Разработка.Базы данных.SQL.Сценарии и вопросы.Insert or update\. Upsert.WebHome]] (insert on conflict).
Alexandr Fokin 1.18 42 )))
43 |(% style="width:150px" %)Брокер сообщений|(% style="width:1177px" %)(((
44 Используется для накопления и доставки TriggerEvent.
45
46 * Сейчас есть реализация под [[Apache Kafka>>doc:Разработка.Брокеры сообщений.Apache Kafka.WebHome]]
Alexandr Fokin 1.44 47 * Скорее всего можно сделать под RabbitMq.
Alexandr Fokin 1.19 48 * Если запускать в одном экземпляре, то можно обойтись inmemory реализаций.
Alexandr Fokin 1.18 49 )))
Alexandr Fokin 31.23 50 |(% style="width:150px" %)InMemory|(% style="width:1177px" %)(((
Alexandr Fokin 31.26 51 * Реализация системы очереди распределения и резервирования задач в класетере.
52 Реализация [[Redis>>doc:Разработка.Базы данных.NoSQL.Ключ-значение структура.Redis.WebHome]].
Alexandr Fokin 31.25 53 * Для использования ExternalCounter реализация под [[Redis>>doc:Разработка.Базы данных.NoSQL.Ключ-значение структура.Redis.WebHome]]. Нетранзакционный счетчик для триггера. 
Alexandr Fokin 31.23 54 ([[Примеры>>doc:.Тема\. Сигналы и триггеры.Примеры.WebHome]] 1.5)
Alexandr Fokin 1.18 55 )))
Alexandr Fokin 31.23 56 )))
Alexandr Fokin 1.1 57 |(% style="width:132px" %)Особенности|(% style="width:1301px" %)(((
Alexandr Fokin 27.14 58 |(% style="width:159px" %)Пакетные транзакции (батчинг).|(% style="width:1168px" %)(((
59 Возможность использовать и комбинировать типы выполнения для разных типов процессов:
Alexandr Fokin 1.1 60
61 * (1 транзакция - 1 процесс),
62 * (1 транзакция - N процессов).
63 )))
Alexandr Fokin 1.6 64 |(% style="width:159px" %)Изоляция шагов и процессов (внутри оной транзакции)|(% style="width:1168px" %)(((
Alexandr Fokin 1.1 65 * Изоляция через db savepoint.
Alexandr Fokin 31.17 66 * Для [[EntityFramework ~| EntityFrameworkCore>>doc:Разработка.NET.Работа с БД.EntityFramework | EntityFrameworkCore.WebHome]] возможность делать InMemory снимок [[Создание снимка ChangeTracker>>doc:Разработка.NET.Работа с БД.EntityFramework | EntityFrameworkCore.Сценарии и проблемы.Создание снимка ChangeTracker.WebHome]] 
Alexandr Fokin 31.18 67 (может использоваться если все изменения накапливаются InMemory (без прямой записи в БД) или же с указанием ручной компенсации, а также ошибка на записи в БД не велика).
Alexandr Fokin 1.38 68 * Допустима реализация на основе того, что InMemory состояние процесса (и задействованных бизнес сущностей) реализовано в виде Immutable компонентов. В этом случае достаточно просто сохранять и восстанавливать ссылку.
Alexandr Fokin 1.39 69 Но предполагаю, что в большинстве бизнес моделей не так и это не не будет востребованным.
Alexandr Fokin 1.1 70 )))
Alexandr Fokin 1.6 71 |(% style="width:159px" %)Передача сигналов для процессов через систему триггеров.|(% style="width:1168px" %)(((
Alexandr Fokin 1.1 72 В том числе для передачи сигналов реализована система триггеров.
Alexandr Fokin 1.14 73 Она позволяет оптимизировать операции с БД и уменьшить конкуренцию между процессами за общее состояние (родительский процесс).
Alexandr Fokin 1.1 74
Alexandr Fokin 6.2 75 См. пример 1.
Alexandr Fokin 1.1 76 )))
Alexandr Fokin 6.2 77 |(% style="width:159px" %)Stream process|(% style="width:1168px" %)(((
78 Возможность реализации stream процессов. Которые обрабатываются некоторый поток сообщений.
79 Через использование триггеров (при поступлении сообщения публикуется TriggerEvent) и системы гарантированного пробуждения (процесс гарантировано не уснет, если есть необработанные сообщения).
80
81 См. пример 2.
82 )))
Alexandr Fokin 1.11 83 |(% style="width:159px" %)Перехват ошибок|(% style="width:1168px" %)Перехват и обработка ошибок, если процесс выкинул exception в движок. Реализацию простого retry с задержкой (создается триггер на следующую попытку).
Alexandr Fokin 27.15 84 В случае пакетной транзакции движок не знает какой конкретно из процессов породил ошибку (если она не перехвачена вручную), то ошибка выставляется на все незавершенные процессы.
Alexandr Fokin 1.6 85 |(% style="width:159px" %)Параллельное выполнение|(% style="width:1168px" %)Допускается запуск нескольких раннеров (на разных нодах), работающих с одной таблицей процессов для распределения нагрузки между ними.
Alexandr Fokin 1.9 86 Допускается фильтрация типов процессов между нодами (чтобы нода выполняла только определенные типы процессов, в том числе по приоритету).
Alexandr Fokin 1.6 87 Доступно для раннеров процессов и триггеров.
Alexandr Fokin 1.9 88 \\Также возможна частичная поставка новой версии процесса и этот процесс будет браться в обработку только ограниченным количеством новых нод исполнителей.
89 \\В перспективе возможны решения с шардированием.
Alexandr Fokin 1.33 90 |(% style="width:159px" %)Soft timeout|(% style="width:1168px" %)(((
91 Возможность указывать soft timeout, который будет мягко приостанавливать цикл (внутри шага процесса), чтобы ограничить общее время транзакции (не делать транзакции долгими (например горизонт postgres)).
92
93 Например:
94
95 1. родительский процесс может создать
96 1) N/2 дочерних процессов за первую сессию выполнения (транзакцию)
97 2) N/2 за вторую сессию выполнения (транзакцию) и уснуть до окончания дочерних процессов.
98 1. Процесс - групповое действие (когда нужно применить действие к строкам таблицы по указанному фильтру).
99 )))
Alexandr Fokin 31.13 100 |(% style="width:159px" %)Range preload process data|(% style="width:1168px" %)(((
101 (Необязательно) возможность в начале сессии обработки пакетно предзагружать данные и бизнес сущности для процессов (Range query) из обрабатываемого батча для оптимизации чтения (если используется обработка пакета процессов в одной транзакции).
102
103 Также есть возможность использовать как дополнительное ограничение по некоторой оценке при пакетной обработке.
Alexandr Fokin 31.16 104 (Например мы загрузили 10 процессов, у каждого по 50 необработанных сообщений, мы отбираем только limit 400 сообщений и связанные процессы для текущей транзакции).
Alexandr Fokin 1.1 105 )))
Alexandr Fokin 31.13 106 )))
Alexandr Fokin 1.1 107
Alexandr Fokin 27.5 108 ----
109
110 ==== Внутренние ссылки: ====
111
112 ====== Дочерние страницы: ======
113
114 {{children/}}
115
116 ====== Обратные ссылки: ======
117
118 {{velocity}}
119 #set ($links = $doc.getBacklinks())
120 #if ($links.size() > 0)
121 #foreach ($docname in $links)
122 #set ($rdoc = $xwiki.getDocument($docname).getTranslatedDocument())
123 * [[$escapetool.xml($rdoc.fullName)]]
124 #end
125 #else
126 No back links for this page!
127 #end
128 {{/velocity}}
129
130 ----