Исходный код вики Инициализация процесса

Редактировал(а) Alexandr Fokin 2024/06/12 15:27

Скрыть последних авторов
Alexandr Fokin 1.44 1 (% border="1" %)
Alexandr Fokin 1.42 2 |(% style="width:157px" %)Триггер инициализации|(% style="width:1328px" %)(((
Alexandr Fokin 1.44 3 (% border="1" %)
Alexandr Fokin 1.42 4 |(% style="width:118px" %)Событие|(% style="width:1191px" %)(((
5 * Событие с UI (по вводу пользователя)
6 * Доменное событие
7 * Поступление сообщения
8 * Срабатывание планировщика или периодического таймера (например [[CRON>>doc:Хостинг.Операционные системы.Linux.Механизмы.CRON.WebHome]]).
9 )))
10 |(% style="width:118px" %)Тип триггера|(% style="width:1191px" %)(((
11 * Ручной запуск (Инициирован пользователем)
12 * По событию (Инициирован событием)
13 * Автоматический по расписанию (Инициирован планировщиком)
14 )))
15 )))
16 |(% style="width:157px" %)Параметры инициализации|(% style="width:1328px" %)(((
Alexandr Fokin 1.44 17 (% border="1" %)
Alexandr Fokin 1.42 18 |(% style="width:227px" %)Тип|(% style="width:272px" %)Параметр|(% style="width:1023px" %)
19 |(% style="width:227px" %)По сущности|(% style="width:272px" %)1 ключ|(% style="width:1023px" %)
20 |(% style="width:227px" %)По группе сущностей ()|(% style="width:272px" %)Набор ключей сущностей|(% style="width:1023px" %)
Alexandr Fokin 1.45 21 |(% style="width:227px" %)На основе данных, по выборке с параметрами|(% style="width:272px" %)dto с параметрами|(% style="width:1023px" %)
Alexandr Fokin 1.42 22 )))
Alexandr Fokin 1.45 23 |(% style="width:157px" %)Инициализация на основе данных|(% style="width:1328px" %)(((
Alexandr Fokin 1.46 24 (% border="1" %)
Alexandr Fokin 1.45 25 |(% style="width:142px" %)Тип|(% style="width:1168px" %)
26 |(% style="width:142px" %)Выборка батчей до исчерпания|(% style="width:1168px" %)(((
27 Выборка данных до тех пор пока они не исчерпаются.
28
29 Замечания:
30
31 * Плохо подходит для больших объемов данных. Может привести к долгому выполнению выборки.
32 * Плохо подходит для сложных условий т.к. может привезти к тому, что будет невозможно выразить полный набор условий в виде запроса или запрос получиться сложным и также будет долго выполняться.
33 * Одна ошибка блокирует всю инициализацию.
34 Если при обработке ключевого доменного объекта возникнет ошибка, то это окажет влияние на всю операцию инициализации.
35 Может быть проблематично отбросить данный доменный объект, чтобы он не попал в выборку.
36
37 Пример:
38 Соединение таблицы доменных сущностей с таблицей процесса и выборка тех сущностей, по которым нет записи в таблице процесса.
39 )))
40 |(% style="width:142px" %)Перебор батчей данных|(% style="width:1168px" %)(((
Alexandr Fokin 1.47 41 Когда речь заходит о переборе данных, то явно касаемся вопрос [[Пагинация | Paging>>doc:Разработка.Базы данных.Сценарии.Пагинация | Paging.WebHome]].
Alexandr Fokin 1.45 42
Alexandr Fokin 1.46 43 Стоит учитывать следующие моменты:
Alexandr Fokin 1.45 44
Alexandr Fokin 1.46 45 * Фильтрация - перебор ограниченного подмножества от всего набора данных (условие).
Alexandr Fokin 1.45 46 * Параллелизм - возможность выполнения операции параллельно (с распределением блоков между обработчиками).
Alexandr Fokin 1.49 47 * Модификация данных - гарантия что в процессе, данные могут быть изменены (сама инициализация, запуск воркера испонителя процесса, или внешним воздействием).
Alexandr Fokin 1.45 48
Alexandr Fokin 1.49 49 Keyset пагинации может быть более эффективной (с точки зрения стоимости запроса) и может избежать части ситуаций пропуска данных (при пагинации на основе страниц).
Alexandr Fokin 1.45 50 )))
51 )))
Alexandr Fokin 1.43 52 |(% style="width:157px" %)Валидация перед запуском|(% style="width:1328px" %)(((
Alexandr Fokin 1.44 53 (% border="1" %)
Alexandr Fokin 1.43 54 |(% style="width:114px" %)Доменные объекты|(% style="width:1195px" %)(((
55 * Валидация доменных объектов на возможность запуска экземпляра процесса
56 (с гарантией, что доменной объект не будет изменен до конца транзакции инициализации, иначе мы можем принять некорректное решение о запуске процесса).
57 * В случае использования [[Оптимистичная блокировка>>doc:Архитектура и модели.Блокировки.Оптимистичная блокировка.WebHome]], необходимо также гарантировать инкрементацию ключа доменных сущностей т.к. скорее всего их поля не изменятся напрямую.
58 * Как вариант - использование более строго уровня изоляции.
59 )))
60 |(% style="width:114px" %)Процессы|(% style="width:1195px" %)(((
61 Если существуют предыдущие экземпляры процесса (__по ключевому набору__), то они также валидируются на возможность запуска нового экземпляра
62
Alexandr Fokin 1.48 63 (% border="1" %)
Alexandr Fokin 1.43 64 |(% colspan="2" %)Отношение экземпляров процесса и ключевых доменных сущностей.
65 |(% style="width:199px" %)Допускается создание только одного экземпляра|(% style="width:978px" %)__Ключевые доменные сущности__ <-(1 к 1)-> __Экземпляр процесса__.
66 Для каждого уникального ключа может быть не более 1 экземпляра процесса.
67 |(% style="width:199px" %)Допускается создание более одного экземпляра|(% style="width:978px" %)(((
68 Здесь речь идет не только о том, что несколько экземпляров активны в один и тот-же момент времени, а о том, что допускается ситуация, что в случае если у нас уже есть существующий экземпляр процесса (выполнявшийся ранее), и вместо того, чтобы изменить его состояние и перезапустить, создаем новый экземпляр (при этом гарантируя валидность такого действия).
69 \\В таком случае мы можем представить следующую модель данных:
70 __Ключевые доменные сущности__ <-(1 к 1)-> __Ключевой сквозной контекст процесса__ <-(1 к N)-> __Экземпляр процесса__.
71
72
73 (% border="1" %)
74 |Ключевой сквозной контекст не всегда может быть выражен явно, но фактически он будет существовать.
75 |(((
76 Пример 1
77
78 Мы можем гарантировать, что в один момент времени имеется только один активный экземпляр процесса (и только он выполняется).
79 \\Мы можем использовать указатель на активный процесс из сквозного контекста,
80 или также мы можем добавить флажок активности в экземпляр процесса и наложить на него уникальный индекс.
81 )))
82 |(((
83 Пример 2
84
85 Сквозной контекст может отслеживать была ли достигнута финальная цель ключевой связки.
86
87 Например:
88
89 * Целью является создание некоторого доменного объекта, когда он будет создан, информация зафиксируется в сквозном контексте.
90 * Эти данные не позволят запустить новый экземпляр процесса так как цель достигнута - объект создан.
91 * Если вдруг выясняется, что по какой-то причине созданный доменный объект объявляется недействительным, и необходимо запустить новый экземпляр процесса (по тому же ключу) для создания нового экземпляра доменного объекта, то также нужно выполнить сброс данных в сквозном контексте.
92 (ручной сброс или подписка на доменной событие, оповещающее о смене статуса созданного объекта (аннулирование, блокировка и др.))
93 )))
94 )))
95 )))
96 )))