Изменения документа Инициализация процесса
Редактировал(а) Alexandr Fokin 2024/06/12 15:27
<
>
отредактировано Alexandr Fokin
на 2024/01/27 17:44
на 2024/01/27 17:44
отредактировано Alexandr Fokin
на 2024/01/11 14:20
на 2024/01/11 14:20
Изменить комментарий:
К данной версии нет комментариев
Комментарий
-
Свойства страницы (1 изменено, 0 добавлено, 0 удалено)
Подробности
- Свойства страницы
-
- Содержимое
-
... ... @@ -1,74 +1,25 @@ 1 1 (% border="1" %) 2 -|(% style="width:15 7px" %)Триггеринициализации|(% style="width:1328px" %)(((2 +|(% style="width:15px" %) |(% style="width:1470px" %)((( 3 3 (% border="1" %) 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" %)((( 4 +|(% style="width:179px" %)Ручной и автоматический запуск процесса|(% style="width:1271px" %) 5 +|(% style="width:179px" %)Валидация перед запуском|(% style="width:1271px" %)((( 17 17 (% border="1" %) 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 -))) 23 -|(% style="width:157px" %)Инициализация на основе данных|(% style="width:1328px" %)((( 24 -|(% style="width:142px" %)Тип|(% style="width:1168px" %) 25 -|(% style="width:142px" %)Выборка батчей до исчерпания|(% style="width:1168px" %)((( 26 -Выборка данных до тех пор пока они не исчерпаются. 27 - 28 -Замечания: 29 - 30 -* Плохо подходит для больших объемов данных. Может привести к долгому выполнению выборки. 31 -* Плохо подходит для сложных условий т.к. может привезти к тому, что будет невозможно выразить полный набор условий в виде запроса или запрос получиться сложным и также будет долго выполняться. 32 -* Одна ошибка блокирует всю инициализацию. 33 -Если при обработке ключевого доменного объекта возникнет ошибка, то это окажет влияние на всю операцию инициализации. 34 -Может быть проблематично отбросить данный доменный объект, чтобы он не попал в выборку. 35 - 36 -Пример: 37 -Соединение таблицы доменных сущностей с таблицей процесса и выборка тех сущностей, по которым нет записи в таблице процесса. 38 -))) 39 -|(% style="width:142px" %)Перебор батчей данных|(% style="width:1168px" %)((( 40 -Когда речь заходит о переборе данных, то явно касаемся вопрос пагинации. 41 - 42 -Условия: 43 - 44 -* Фильтрация - возможность перебрать не весь сет данных, а только часть по условию. 45 -* Параллелизм - возможность выполнения операции параллельно (с распределением блоков между обработчиками). 46 -* Модификация данных - гарантия что в процессе, данные могут быть изменены (самой инициализацией или внешним воздействием). 47 - 48 -|(% style="width:125px" %)Тип пагинации|(% style="width:121px" %)Параллелизм|(% style="width:176px" %)Модификация данных|(% style="width:188px" %)Фильтрация|(% style="width:540px" %)Описание 49 -|(% style="width:125px" %)Offset|(% style="width:121px" %)+|(% style="width:176px" %)-|(% style="width:188px" %)+|(% style="width:540px" %)1) Распределить фиксирует общее кол-во страниц. 50 -2) Распределить запускает обработчики на диапазонах страниц данных. 51 -|(% style="width:125px" %)Keyset|(% style="width:121px" %)-|(% style="width:176px" %)+|(% style="width:188px" %)+|(% style="width:540px" %) 52 -))) 53 -))) 54 -|(% style="width:157px" %)Валидация перед запуском|(% style="width:1328px" %)((( 55 -(% border="1" %) 56 -|(% style="width:114px" %)Доменные объекты|(% style="width:1195px" %)((( 57 -* Валидация доменных объектов на возможность запуска экземпляра процесса 58 -(с гарантией, что доменной объект не будет изменен до конца транзакции инициализации, иначе мы можем принять некорректное решение о запуске процесса). 7 +|((( 8 +* Валидация доменных объектов на возможность запуска экземпляра процесса (с гарантией, что доменной объект не будет изменен до конца транзакции планировщика, иначе мы можем принять некорректное решение о запуске процесса). 59 59 * В случае использования [[Оптимистичная блокировка>>doc:Архитектура и модели.Блокировки.Оптимистичная блокировка.WebHome]], необходимо также гарантировать инкрементацию ключа доменных сущностей т.к. скорее всего их поля не изменятся напрямую. 60 60 * Как вариант - использование более строго уровня изоляции. 61 61 ))) 62 -|( % style="width:114px" %)Процессы|(% style="width:1195px" %)(((12 +|((( 63 63 Если существуют предыдущие экземпляры процесса (__по ключевому набору__), то они также валидируются на возможность запуска нового экземпляра 64 64 65 -|(% colspan="2" %)Отношение экземпляров процесса и ключевых доменных сущностей. 66 -|(% style="width:199px" %)Допускается создание только одного экземпляра|(% style="width:978px" %)__Ключевые доменные сущности__ <-(1 к 1)-> __Экземпляр процесса__. 15 +(% border="1" %) 16 +|(% colspan="2" style="width:157px" %)Отношение экземпляров процесса и ключевых доменных сущностей. 17 +|(% style="width:172px" %)Допускается создание только одного экземпляра процесса|(% style="width:1063px" %)Экземпляр ключевой доменной сущности <-(1 к 1)-> Экземпляр процесса. 67 67 Для каждого уникального ключа может быть не более 1 экземпляра процесса. 68 -|(% style="width:1 99px" %)Допускается создание более одного экземпляра|(% style="width:978px" %)(((69 -Здесь речь идет не толькоотом, что несколько экземпляров активны в один и тот-же момент времени, а о том, что допускается ситуация, что в случае если у нас уже есть существующий экземпляр процесса (выполнявшийся ранее),и вместо того, чтобыизменитьего состояние и перезапустить, создаем новый экземпляр (при этом гарантируя валидность такого действия).19 +|(% style="width:172px" %)Допускается создание более одного экземпляра|(% style="width:1063px" %)((( 20 +Здесь речь идет не о том, что несколько экземпляров активны в один и тот-же момент времени, а о том, что допускается ситуация, что в случае если у нас уже есть существующий экземпляр процесса (выполнявшийся ранее), мы не меняем его состояние и перезапускаем, а создаем новый экземпляр (при этом гарантируя валидность такого действия). 70 70 \\В таком случае мы можем представить следующую модель данных: 71 - __Ключевые доменные сущности__<-(1 к 1)->__Ключевой сквозной контекст процесса__<-(1 к N)->__Экземпляр процесса__.22 +Ключевые доменные сущности <-(1 к 1)-> Ключевой сквозной контекст процесса <-(1 к N)-> Экземпляр процесса. 72 72 73 73 74 74 (% border="1" %) ... ... @@ -94,14 +94,10 @@ 94 94 ))) 95 95 ))) 96 96 ))) 97 - 98 - 99 99 ))) 100 -|(% style="width:1 57px" %) |(% style="width:1328px" %)49 +|(% style="width:179px" %) |(% style="width:1271px" %) 101 101 102 102 (% border="1" %) 103 -|(% style="width:15px" %) |(% style="width:1470px" %)((( 104 -(% border="1" %) 105 105 |(% style="width:151px" %)На основе события|(% style="width:1188px" %)Событие запуска процесса поступает извне, и обязательства о выборке данных для процесса лежат на внешнем компоненте. 106 106 События могут помещаться в некоторый буфер - хранилище (брокер сообщений, БД) и разбираться обработчиком до исчерпания. 107 107 |(% style="width:151px" %)На основе данных|(% style="width:1188px" %)((( ... ... @@ -127,10 +127,6 @@ 127 127 |(% style="width:177px" %)Инициализация, привязанная к дате.|(% style="width:993px" %)Обработчик привязан к конкретной дате и рассматривает некоторый ограниченный набор, например одни сутки относительно указанной даты. 128 128 Таким образом мы явно ограничиваем блок данных. Но нужно учесть сценарии с возникновением ошибки, т.к. следующее срабатывание уже будет на основе новой даты. 129 129 |(% style="width:177px" %)Перебор всего сета доменных сущностей.|(% style="width:993px" %)((( 130 -| |Пагинация|Параллелизм|Фильтрация сета| 131 -| |Страницы|+|-| 132 -| |Смещение|-|+| 133 - 134 134 Необходимое условие: Наличие способа перебрать данные сета данных. 135 135 Вариант 1: Если перебираем записи без использования параллелизма, то нам достаточно организовать некоторую пагинацию и последовательно идти, обрабатывая подходящие для запуска процесса строки. 136 136 \\Вариант 2: ... ... @@ -137,14 +137,12 @@ 137 137 Если мы уверены, что доменные объекты не удаляются, то мы можем отсортировать их по дате создания и первичному ключу (Если есть уникальный автоинкреметный числовой ключ, то можно использовать его). 138 138 Таким образом мы получим детерминированные страницы данных, которые даже можно обрабатывать параллельно. 139 139 Невозможно выполнить, если допускается удаление объектов т.к. оно может изменить данные в страницах. 140 -Либо можно прикинуть вариант, когда мы используем блокировку доменных объектов через БД, таким образомв каждом обрабатываем батче(в один момент времени)будет уникальный набордоменных объектов, и если один и тотже объектпопадет в разные батчи, то в первом случае он обработается, а во втором он будет отброшен(есть вероятность, что некоторые строки, существовавшие на момент начала операции, не попадут в выборку).83 +Либо можно прикинуть вариант, когда мы используем блокировку доменных объектов через БД, таким в каждом обрабатываем батче будет уникальный набор строк, и если одна и та же строка попадет в разные батчи, то в первом случае она обработается, а во втором она будет отброшена. 141 141 142 142 Вариант 4: 143 143 Если кол-во записей не очень велико и мы можем без проблем полностью уместить сет всех ключей в оперативной памяти. 144 144 (Не требует гарантии, что сущность нельзя удалить, т,к. в случае обнаружения удаления можно просто пропустить ключ). 145 145 146 -[[Пагинация | Paging>>doc:Разработка.Базы данных.Сценарии.Пагинация | Paging.WebHome]] 147 - 148 148 Can queries that users ORDER BY using date to sort data be non deterministic? 149 149 [[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]] 150 150 )))