Изменения документа Инициализация процесса
Редактировал(а) Alexandr Fokin 2024/06/12 15:27
<
>
отредактировано Alexandr Fokin
на 2024/01/27 17:19
на 2024/01/27 17:19
отредактировано Alexandr Fokin
на 2024/01/11 14:25
на 2024/01/11 14:25
Изменить комментарий:
К данной версии нет комментариев
Комментарий
-
Свойства страницы (1 изменено, 0 добавлено, 0 удалено)
Подробности
- Свойства страницы
-
- Содержимое
-
... ... @@ -1,89 +39,7 @@ 1 -|(% style="width:157px" %)Триггер инициализации|(% style="width:1328px" %)((( 2 -|(% style="width:118px" %)Событие|(% style="width:1191px" %)((( 3 -* Событие с UI (по вводу пользователя) 4 -* Доменное событие 5 -* Поступление сообщения 6 -* Срабатывание планировщика или периодического таймера (например [[CRON>>doc:Хостинг.Операционные системы.Linux.Механизмы.CRON.WebHome]]). 7 -))) 8 -|(% style="width:118px" %)Тип триггера|(% style="width:1191px" %)((( 9 -* Ручной запуск (Инициирован пользователем) 10 -* По событию (Инициирован событием) 11 -* Автоматический по расписанию (Инициирован планировщиком) 12 -))) 13 -))) 14 -|(% style="width:157px" %)Параметры инициализации|(% style="width:1328px" %)((( 15 -|(% style="width:227px" %)Тип|(% style="width:272px" %)Параметр|(% style="width:1023px" %) 16 -|(% style="width:227px" %)По сущности|(% style="width:272px" %)1 ключ|(% style="width:1023px" %) 17 -|(% style="width:227px" %)По группе сущностей ()|(% style="width:272px" %)Набор ключей сущностей|(% style="width:1023px" %) 18 -|(% style="width:227px" %)По выборке с параметрами|(% style="width:272px" %)dto с параметрами|(% style="width:1023px" %) 19 -))) 20 -|(% style="width:157px" %)Валидация перед запуском|(% style="width:1328px" %)((( 21 -|(% style="width:114px" %)Доменные объекты|(% style="width:1195px" %)((( 22 -* Валидация доменных объектов на возможность запуска экземпляра процесса 23 -(с гарантией, что доменной объект не будет изменен до конца транзакции инициализации, иначе мы можем принять некорректное решение о запуске процесса). 24 -* В случае использования [[Оптимистичная блокировка>>doc:Архитектура и модели.Блокировки.Оптимистичная блокировка.WebHome]], необходимо также гарантировать инкрементацию ключа доменных сущностей т.к. скорее всего их поля не изменятся напрямую. 25 -* Как вариант - использование более строго уровня изоляции. 26 -))) 27 -|(% style="width:114px" %)Процессы|(% style="width:1195px" %)((( 28 -Если существуют предыдущие экземпляры процесса (__по ключевому набору__), то они также валидируются на возможность запуска нового экземпляра 29 - 30 -|(% colspan="2" %)Отношение экземпляров процесса и ключевых доменных сущностей. 31 -|(% style="width:199px" %)Допускается создание только одного экземпляра|(% style="width:978px" %)__Ключевые доменные сущности__ <-(1 к 1)-> __Экземпляр процесса__. 32 -Для каждого уникального ключа может быть не более 1 экземпляра процесса. 33 -|(% style="width:199px" %)Допускается создание более одного экземпляра|(% style="width:978px" %)((( 34 -Здесь речь идет не только о том, что несколько экземпляров активны в один и тот-же момент времени, а о том, что допускается ситуация, что в случае если у нас уже есть существующий экземпляр процесса (выполнявшийся ранее), и вместо того, чтобы изменить его состояние и перезапустить, создаем новый экземпляр (при этом гарантируя валидность такого действия). 35 -\\В таком случае мы можем представить следующую модель данных: 36 -__Ключевые доменные сущности__ <-(1 к 1)-> __Ключевой сквозной контекст процесса__ <-(1 к N)-> __Экземпляр процесса__. 37 - 38 - 39 39 (% border="1" %) 40 -|Ключевой сквозной контекст не всегда может быть выражен явно, но фактически он будет существовать. 41 -|((( 42 -Пример 1 43 - 44 -Мы можем гарантировать, что в один момент времени имеется только один активный экземпляр процесса (и только он выполняется). 45 -\\Мы можем использовать указатель на активный процесс из сквозного контекста, 46 -или также мы можем добавить флажок активности в экземпляр процесса и наложить на него уникальный индекс. 47 -))) 48 -|((( 49 -Пример 2 50 - 51 -Сквозной контекст может отслеживать была ли достигнута финальная цель ключевой связки. 52 - 53 -Например: 54 - 55 -* Целью является создание некоторого доменного объекта, когда он будет создан, информация зафиксируется в сквозном контексте. 56 -* Эти данные не позволят запустить новый экземпляр процесса так как цель достигнута - объект создан. 57 -* Если вдруг выясняется, что по какой-то причине созданный доменный объект объявляется недействительным, и необходимо запустить новый экземпляр процесса (по тому же ключу) для создания нового экземпляра доменного объекта, то также нужно выполнить сброс данных в сквозном контексте. 58 -(ручной сброс или подписка на доменной событие, оповещающее о смене статуса созданного объекта (аннулирование, блокировка и др.)) 59 -))) 60 -))) 61 -))) 62 - 63 - 64 -))) 65 -|(% style="width:157px" %) |(% style="width:1328px" %) 66 - 67 - 68 - 69 -(% border="1" %) 70 70 |(% style="width:15px" %) |(% style="width:1470px" %)((( 71 71 (% border="1" %) 72 -|(% style="width:179px" %)Ручной и автоматический запуск процесса|(% style="width:1271px" %)((( 73 -|(% style="width:301px" %)Автоматический запуск|(% style="width:951px" %)((( 74 -|по таймеру (по выборке)| 75 -))) 76 -|(% style="width:301px" %)Ручной запуск|(% style="width:951px" %)((( 77 -|По сущности (ключу)| 78 -|По групповой выборке (список ключей)| 79 -|По групповой выборке с параметрами| 80 -))) 81 -|(% style="width:301px" %)Запуск по событию|(% style="width:951px" %)((( 82 -|По сущности (ключу)| 83 -|По групповой выборке (список ключей)| 84 -|По групповой выборке с параметрами| 85 -))) 86 -))) 4 +|(% style="width:179px" %)Ручной и автоматический запуск процесса|(% style="width:1271px" %) 87 87 |(% style="width:179px" %)Валидация перед запуском|(% style="width:1271px" %)((( 88 88 (% border="1" %) 89 89 |((( ... ... @@ -156,10 +156,6 @@ 156 156 |(% style="width:177px" %)Инициализация, привязанная к дате.|(% style="width:993px" %)Обработчик привязан к конкретной дате и рассматривает некоторый ограниченный набор, например одни сутки относительно указанной даты. 157 157 Таким образом мы явно ограничиваем блок данных. Но нужно учесть сценарии с возникновением ошибки, т.к. следующее срабатывание уже будет на основе новой даты. 158 158 |(% style="width:177px" %)Перебор всего сета доменных сущностей.|(% style="width:993px" %)((( 159 -| |Пагинация|Параллелизм|Фильтрация сета| 160 -| |Страницы|+|-| 161 -| |Смещение|-|+| 162 - 163 163 Необходимое условие: Наличие способа перебрать данные сета данных. 164 164 Вариант 1: Если перебираем записи без использования параллелизма, то нам достаточно организовать некоторую пагинацию и последовательно идти, обрабатывая подходящие для запуска процесса строки. 165 165 \\Вариант 2: ... ... @@ -166,7 +166,7 @@ 166 166 Если мы уверены, что доменные объекты не удаляются, то мы можем отсортировать их по дате создания и первичному ключу (Если есть уникальный автоинкреметный числовой ключ, то можно использовать его). 167 167 Таким образом мы получим детерминированные страницы данных, которые даже можно обрабатывать параллельно. 168 168 Невозможно выполнить, если допускается удаление объектов т.к. оно может изменить данные в страницах. 169 -Либо можно прикинуть вариант, когда мы используем блокировку доменных объектов через БД, таким образом в каждом обрабатываем батче (в один момент времени) будет уникальный набор доменных объектов, и если один и тот же объект попадет в разные батчи, то в первом случае он обработается, а во втором он будет отброшен (есть вероятность, что некоторые строки, существовавшие на момент начала операции, не попадут в выборку).83 +Либо можно прикинуть вариант, когда мы используем блокировку доменных объектов через БД, таким образом в каждом обрабатываем батче (в один момент времени) будет уникальный набор доменных объектов, и если один и тот же объект попадет в разные батчи, то в первом случае он обработается, а во втором он будет отброшен. 170 170 171 171 Вариант 4: 172 172 Если кол-во записей не очень велико и мы можем без проблем полностью уместить сет всех ключей в оперативной памяти.