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

Версия 1.44 от Alexandr Fokin на 2024/01/27 17:19

Скрыть последних авторов
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" %)
21 |(% style="width:227px" %)По выборке с параметрами|(% style="width:272px" %)dto с параметрами|(% style="width:1023px" %)
22 )))
Alexandr Fokin 1.43 23 |(% style="width:157px" %)Валидация перед запуском|(% style="width:1328px" %)(((
Alexandr Fokin 1.44 24 (% border="1" %)
Alexandr Fokin 1.43 25 |(% style="width:114px" %)Доменные объекты|(% style="width:1195px" %)(((
26 * Валидация доменных объектов на возможность запуска экземпляра процесса
27 (с гарантией, что доменной объект не будет изменен до конца транзакции инициализации, иначе мы можем принять некорректное решение о запуске процесса).
28 * В случае использования [[Оптимистичная блокировка>>doc:Архитектура и модели.Блокировки.Оптимистичная блокировка.WebHome]], необходимо также гарантировать инкрементацию ключа доменных сущностей т.к. скорее всего их поля не изменятся напрямую.
29 * Как вариант - использование более строго уровня изоляции.
30 )))
31 |(% style="width:114px" %)Процессы|(% style="width:1195px" %)(((
32 Если существуют предыдущие экземпляры процесса (__по ключевому набору__), то они также валидируются на возможность запуска нового экземпляра
33
34 |(% colspan="2" %)Отношение экземпляров процесса и ключевых доменных сущностей.
35 |(% style="width:199px" %)Допускается создание только одного экземпляра|(% style="width:978px" %)__Ключевые доменные сущности__ <-(1 к 1)-> __Экземпляр процесса__.
36 Для каждого уникального ключа может быть не более 1 экземпляра процесса.
37 |(% style="width:199px" %)Допускается создание более одного экземпляра|(% style="width:978px" %)(((
38 Здесь речь идет не только о том, что несколько экземпляров активны в один и тот-же момент времени, а о том, что допускается ситуация, что в случае если у нас уже есть существующий экземпляр процесса (выполнявшийся ранее), и вместо того, чтобы изменить его состояние и перезапустить, создаем новый экземпляр (при этом гарантируя валидность такого действия).
39 \\В таком случае мы можем представить следующую модель данных:
40 __Ключевые доменные сущности__ <-(1 к 1)-> __Ключевой сквозной контекст процесса__ <-(1 к N)-> __Экземпляр процесса__.
41
42
43 (% border="1" %)
44 |Ключевой сквозной контекст не всегда может быть выражен явно, но фактически он будет существовать.
45 |(((
46 Пример 1
47
48 Мы можем гарантировать, что в один момент времени имеется только один активный экземпляр процесса (и только он выполняется).
49 \\Мы можем использовать указатель на активный процесс из сквозного контекста,
50 или также мы можем добавить флажок активности в экземпляр процесса и наложить на него уникальный индекс.
51 )))
52 |(((
53 Пример 2
54
55 Сквозной контекст может отслеживать была ли достигнута финальная цель ключевой связки.
56
57 Например:
58
59 * Целью является создание некоторого доменного объекта, когда он будет создан, информация зафиксируется в сквозном контексте.
60 * Эти данные не позволят запустить новый экземпляр процесса так как цель достигнута - объект создан.
61 * Если вдруг выясняется, что по какой-то причине созданный доменный объект объявляется недействительным, и необходимо запустить новый экземпляр процесса (по тому же ключу) для создания нового экземпляра доменного объекта, то также нужно выполнить сброс данных в сквозном контексте.
62 (ручной сброс или подписка на доменной событие, оповещающее о смене статуса созданного объекта (аннулирование, блокировка и др.))
63 )))
64 )))
65 )))
66
67
68 )))
Alexandr Fokin 1.42 69 |(% style="width:157px" %) |(% style="width:1328px" %)
70
71
Alexandr Fokin 1.28 72 (% border="1" %)
Alexandr Fokin 1.4 73 |(% style="width:15px" %) |(% style="width:1470px" %)(((
Alexandr Fokin 1.17 74 (% border="1" %)
Alexandr Fokin 1.38 75 |(% style="width:179px" %)Ручной и автоматический запуск процесса|(% style="width:1271px" %)(((
Alexandr Fokin 1.40 76 |(% style="width:301px" %)Автоматический запуск|(% style="width:951px" %)(((
Alexandr Fokin 1.39 77 |по таймеру (по выборке)|
78 )))
Alexandr Fokin 1.40 79 |(% style="width:301px" %)Ручной запуск|(% style="width:951px" %)(((
80 |По сущности (ключу)|
Alexandr Fokin 1.41 81 |По групповой выборке (список ключей)|
Alexandr Fokin 1.40 82 |По групповой выборке с параметрами|
Alexandr Fokin 1.38 83 )))
Alexandr Fokin 1.40 84 |(% style="width:301px" %)Запуск по событию|(% style="width:951px" %)(((
85 |По сущности (ключу)|
Alexandr Fokin 1.41 86 |По групповой выборке (список ключей)|
Alexandr Fokin 1.39 87 |По групповой выборке с параметрами|
88 )))
89 )))
Alexandr Fokin 1.5 90 |(% style="width:179px" %)Валидация перед запуском|(% style="width:1271px" %)(((
Alexandr Fokin 1.17 91 (% border="1" %)
Alexandr Fokin 1.4 92 |(((
Alexandr Fokin 1.14 93 * Валидация доменных объектов на возможность запуска экземпляра процесса (с гарантией, что доменной объект не будет изменен до конца транзакции планировщика, иначе мы можем принять некорректное решение о запуске процесса).
94 * В случае использования [[Оптимистичная блокировка>>doc:Архитектура и модели.Блокировки.Оптимистичная блокировка.WebHome]], необходимо также гарантировать инкрементацию ключа доменных сущностей т.к. скорее всего их поля не изменятся напрямую.
95 * Как вариант - использование более строго уровня изоляции.
96 )))
97 |(((
Alexandr Fokin 1.4 98 Если существуют предыдущие экземпляры процесса (__по ключевому набору__), то они также валидируются на возможность запуска нового экземпляра
99
Alexandr Fokin 1.18 100 (% border="1" %)
Alexandr Fokin 1.6 101 |(% colspan="2" style="width:157px" %)Отношение экземпляров процесса и ключевых доменных сущностей.
Alexandr Fokin 1.23 102 |(% style="width:172px" %)Допускается создание только одного экземпляра процесса|(% style="width:1063px" %)Экземпляр ключевой доменной сущности <-(1 к 1)-> Экземпляр процесса.
103 Для каждого уникального ключа может быть не более 1 экземпляра процесса.
104 |(% style="width:172px" %)Допускается создание более одного экземпляра|(% style="width:1063px" %)(((
Alexandr Fokin 1.24 105 Здесь речь идет не о том, что несколько экземпляров активны в один и тот-же момент времени, а о том, что допускается ситуация, что в случае если у нас уже есть существующий экземпляр процесса (выполнявшийся ранее), мы не меняем его состояние и перезапускаем, а создаем новый экземпляр (при этом гарантируя валидность такого действия).
Alexandr Fokin 1.5 106 \\В таком случае мы можем представить следующую модель данных:
Alexandr Fokin 1.19 107 Ключевые доменные сущности <-(1 к 1)-> Ключевой сквозной контекст процесса <-(1 к N)-> Экземпляр процесса.
Alexandr Fokin 1.6 108
Alexandr Fokin 1.4 109
Alexandr Fokin 1.25 110 (% border="1" %)
Alexandr Fokin 1.6 111 |Ключевой сквозной контекст не всегда может быть выражен явно, но фактически он будет существовать.
112 |(((
113 Пример 1
114
115 Мы можем гарантировать, что в один момент времени имеется только один активный экземпляр процесса (и только он выполняется).
116 \\Мы можем использовать указатель на активный процесс из сквозного контекста,
117 или также мы можем добавить флажок активности в экземпляр процесса и наложить на него уникальный индекс.
Alexandr Fokin 1.4 118 )))
Alexandr Fokin 1.6 119 |(((
120 Пример 2
121
122 Сквозной контекст может отслеживать была ли достигнута финальная цель ключевой связки.
123
124 Например:
125
Alexandr Fokin 1.21 126 * Целью является создание некоторого доменного объекта, когда он будет создан, информация зафиксируется в сквозном контексте.
Alexandr Fokin 1.26 127 * Эти данные не позволят запустить новый экземпляр процесса так как цель достигнута - объект создан.
Alexandr Fokin 1.22 128 * Если вдруг выясняется, что по какой-то причине созданный доменный объект объявляется недействительным, и необходимо запустить новый экземпляр процесса (по тому же ключу) для создания нового экземпляра доменного объекта, то также нужно выполнить сброс данных в сквозном контексте.
Alexandr Fokin 1.8 129 (ручной сброс или подписка на доменной событие, оповещающее о смене статуса созданного объекта (аннулирование, блокировка и др.))
Alexandr Fokin 1.4 130 )))
Alexandr Fokin 1.6 131 )))
132 )))
133 )))
Alexandr Fokin 1.5 134 |(% style="width:179px" %) |(% style="width:1271px" %)
Alexandr Fokin 1.4 135
Alexandr Fokin 1.29 136 (% border="1" %)
Alexandr Fokin 1.4 137 |(% style="width:151px" %)На основе события|(% style="width:1188px" %)Событие запуска процесса поступает извне, и обязательства о выборке данных для процесса лежат на внешнем компоненте.
Alexandr Fokin 1.2 138 События могут помещаться в некоторый буфер - хранилище (брокер сообщений, БД) и разбираться обработчиком до исчерпания.
Alexandr Fokin 1.4 139 |(% style="width:151px" %)На основе данных|(% style="width:1188px" %)(((
Alexandr Fokin 1.29 140 (% border="1" %)
Alexandr Fokin 1.4 141 |(% colspan="2" %)Замечания
142 |Параллелизм|Гарантия, что код планировщика выполняются в эксклюзивном режиме, в случае если он запущен в нескольких экземплярах.
Alexandr Fokin 1.2 143 Предполагается [[Пессимистичная блокировка>>doc:Архитектура и модели.Блокировки.Пессимистичная блокировка.WebHome]] на уровне всех экземпляров.
Alexandr Fokin 1.4 144
Alexandr Fokin 1.29 145 (% border="1" %)
Alexandr Fokin 1.4 146 |(% style="width:177px" %)Тип|(% style="width:993px" %)
147 |(% style="width:177px" %)Выборка до исчерпания|(% style="width:993px" %)(((
Alexandr Fokin 1.2 148 Выборка данных до тех пор пока они не исчерпаются.
149
Alexandr Fokin 1.3 150 Замечания:
151
Alexandr Fokin 1.27 152 * Плохо подходит для больших объемов данных. Может привести к долгому выполнению выборки.
Alexandr Fokin 1.3 153 * Плохо подходит для сложных условий т.к. может привезти к тому, что будет невозможно выразить полный набор условий в виде запроса или запрос получиться сложным и также будет долго выполняться.
154 * Если при обработке ключевого доменного объекта возникнет ошибка, то это окажет влияние на всю операцию инициализации. Может быть проблематично отбросить данный доменный объект, чтобы он не попал в выборку.
155
Alexandr Fokin 1.2 156 Пример:
Alexandr Fokin 1.1 157 Соединение таблицы доменных сущностей с таблицей процесса и выборка тех сущностей, по которым нет записи в таблице процесса.
Alexandr Fokin 1.2 158 )))
Alexandr Fokin 1.4 159 |(% style="width:177px" %)Инициализация, привязанная к дате.|(% style="width:993px" %)Обработчик привязан к конкретной дате и рассматривает некоторый ограниченный набор, например одни сутки относительно указанной даты.
Alexandr Fokin 1.1 160 Таким образом мы явно ограничиваем блок данных. Но нужно учесть сценарии с возникновением ошибки, т.к. следующее срабатывание уже будет на основе новой даты.
Alexandr Fokin 1.4 161 |(% style="width:177px" %)Перебор всего сета доменных сущностей.|(% style="width:993px" %)(((
Alexandr Fokin 1.37 162 | |Пагинация|Параллелизм|Фильтрация сета|
163 | |Страницы|+|-|
164 | |Смещение|-|+|
Alexandr Fokin 1.36 165
Alexandr Fokin 1.38 166 Необходимое условие: Наличие способа перебрать данные сета данных.
Alexandr Fokin 1.31 167 Вариант 1: Если перебираем записи без использования параллелизма, то нам достаточно организовать некоторую пагинацию и последовательно идти, обрабатывая подходящие для запуска процесса строки.
168 \\Вариант 2:
Alexandr Fokin 1.32 169 Если мы уверены, что доменные объекты не удаляются, то мы можем отсортировать их по дате создания и первичному ключу (Если есть уникальный автоинкреметный числовой ключ, то можно использовать его).
170 Таким образом мы получим детерминированные страницы данных, которые даже можно обрабатывать параллельно.
171 Невозможно выполнить, если допускается удаление объектов т.к. оно может изменить данные в страницах.
Alexandr Fokin 1.35 172 Либо можно прикинуть вариант, когда мы используем блокировку доменных объектов через БД, таким образом в каждом обрабатываем батче (в один момент времени) будет уникальный набор доменных объектов, и если один и тот же объект попадет в разные батчи, то в первом случае он обработается, а во втором он будет отброшен (есть вероятность, что некоторые строки, существовавшие на момент начала операции, не попадут в выборку).
Alexandr Fokin 1.1 173
Alexandr Fokin 1.31 174 Вариант 4:
Alexandr Fokin 1.3 175 Если кол-во записей не очень велико и мы можем без проблем полностью уместить сет всех ключей в оперативной памяти.
Alexandr Fokin 1.9 176 (Не требует гарантии, что сущность нельзя удалить, т,к. в случае обнаружения удаления можно просто пропустить ключ).
Alexandr Fokin 1.3 177
Alexandr Fokin 1.34 178 [[Пагинация | Paging>>doc:Разработка.Базы данных.Сценарии.Пагинация | Paging.WebHome]]
179
Alexandr Fokin 1.2 180 Can queries that users ORDER BY using date to sort data be non deterministic?
181 [[https:~~/~~/dba.stackexchange.com/questions/241056/can-queries-that-users-order-by-using-date-to-sort-data-be-non-deterministic>>https://dba.stackexchange.com/questions/241056/can-queries-that-users-order-by-using-date-to-sort-data-be-non-deterministic]]
Alexandr Fokin 1.1 182 )))
Alexandr Fokin 1.2 183 )))
184 )))
Alexandr Fokin 1.4 185 |(% style="width:15px" %) |(% style="width:1470px" %)
Alexandr Fokin 1.1 186
187