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

Версия 1.19 от Alexandr Fokin на 2024/01/11 13:38

Скрыть последних авторов
Alexandr Fokin 1.4 1 |(% style="width:15px" %) |(% style="width:1470px" %)(((
Alexandr Fokin 1.17 2 (% border="1" %)
Alexandr Fokin 1.5 3 |(% style="width:179px" %)Ручной и автоматический запуск процесса|(% style="width:1271px" %)
4 |(% style="width:179px" %)Валидация перед запуском|(% style="width:1271px" %)(((
Alexandr Fokin 1.17 5 (% border="1" %)
Alexandr Fokin 1.4 6 |(((
Alexandr Fokin 1.14 7 * Валидация доменных объектов на возможность запуска экземпляра процесса (с гарантией, что доменной объект не будет изменен до конца транзакции планировщика, иначе мы можем принять некорректное решение о запуске процесса).
8 * В случае использования [[Оптимистичная блокировка>>doc:Архитектура и модели.Блокировки.Оптимистичная блокировка.WebHome]], необходимо также гарантировать инкрементацию ключа доменных сущностей т.к. скорее всего их поля не изменятся напрямую.
9 * Как вариант - использование более строго уровня изоляции.
10 )))
11 |(((
Alexandr Fokin 1.4 12 Если существуют предыдущие экземпляры процесса (__по ключевому набору__), то они также валидируются на возможность запуска нового экземпляра
13
Alexandr Fokin 1.18 14 (% border="1" %)
Alexandr Fokin 1.6 15 |(% colspan="2" style="width:157px" %)Отношение экземпляров процесса и ключевых доменных сущностей.
16 |(% style="width:157px" %)Допускается создание только одного экземпляра процесса|(% style="width:1078px" %)Экземпляр ключевой доменной сущности <-(1 к 1)-> Экземпляр процесса.
Alexandr Fokin 1.4 17 Для каждого уникального ключа может быть только 0 или 1 экземпляр процесса.
Alexandr Fokin 1.6 18 |(% style="width:157px" %)Допускается создание более одного экземпляра|(% style="width:1078px" %)(((
19 Здесь речь идет не о том, что запуск возможен в один момент времени, а в целом, что допускается ситуация, что в случае если процесс уже выполнялся, мы не меняем его состояние и перезапускаем, а создаем новый экземпляр (при этом гарантируя валидность).
Alexandr Fokin 1.5 20 \\В таком случае мы можем представить следующую модель данных:
Alexandr Fokin 1.19 21 Ключевые доменные сущности <-(1 к 1)-> Ключевой сквозной контекст процесса <-(1 к N)-> Экземпляр процесса.
Alexandr Fokin 1.6 22
Alexandr Fokin 1.4 23
Alexandr Fokin 1.6 24 |Ключевой сквозной контекст не всегда может быть выражен явно, но фактически он будет существовать.
25 |(((
26 Пример 1
27
28 Мы можем гарантировать, что в один момент времени имеется только один активный экземпляр процесса (и только он выполняется).
29 \\Мы можем использовать указатель на активный процесс из сквозного контекста,
30 или также мы можем добавить флажок активности в экземпляр процесса и наложить на него уникальный индекс.
Alexandr Fokin 1.4 31 )))
Alexandr Fokin 1.6 32 |(((
33 Пример 2
34
35 Сквозной контекст может отслеживать была ли достигнута финальная цель ключевой связки.
36
37 Например:
38
39 * целью является создание некоторого доменного объекта, когда он будет создан, информацию зафиксируется в сквозном контексте.
40 * Эти данные не позволят запустить новый экземпляр так как цель достигнута - объект создан.
Alexandr Fokin 1.8 41 * Если вдруг выясняется, что по какой-то причине созданный доменный объект объявляется недействительным, и не обходимо запустить процесс (по тому же ключу) для создания нового экземпляра доменного объекта, то также необходимо сбросить данные в сквозном контексте.
42 (ручной сброс или подписка на доменной событие, оповещающее о смене статуса созданного объекта (аннулирование, блокировка и др.))
Alexandr Fokin 1.4 43 )))
Alexandr Fokin 1.6 44 )))
45 )))
46 )))
Alexandr Fokin 1.5 47 |(% style="width:179px" %) |(% style="width:1271px" %)
Alexandr Fokin 1.4 48
49 |(% style="width:151px" %)На основе события|(% style="width:1188px" %)Событие запуска процесса поступает извне, и обязательства о выборке данных для процесса лежат на внешнем компоненте.
Alexandr Fokin 1.2 50 События могут помещаться в некоторый буфер - хранилище (брокер сообщений, БД) и разбираться обработчиком до исчерпания.
Alexandr Fokin 1.4 51 |(% style="width:151px" %)На основе данных|(% style="width:1188px" %)(((
52 |(% colspan="2" %)Замечания
53 |Параллелизм|Гарантия, что код планировщика выполняются в эксклюзивном режиме, в случае если он запущен в нескольких экземплярах.
Alexandr Fokin 1.2 54 Предполагается [[Пессимистичная блокировка>>doc:Архитектура и модели.Блокировки.Пессимистичная блокировка.WebHome]] на уровне всех экземпляров.
Alexandr Fokin 1.4 55
56 |(% style="width:177px" %)Тип|(% style="width:993px" %)
57 |(% style="width:177px" %)Выборка до исчерпания|(% style="width:993px" %)(((
Alexandr Fokin 1.2 58 Выборка данных до тех пор пока они не исчерпаются.
59
Alexandr Fokin 1.3 60 Замечания:
61
62 * Плохо подходит для больших объемов данных. Может привести к тому,
63 * Плохо подходит для сложных условий т.к. может привезти к тому, что будет невозможно выразить полный набор условий в виде запроса или запрос получиться сложным и также будет долго выполняться.
64
Alexandr Fokin 1.2 65 Пример:
Alexandr Fokin 1.1 66 Соединение таблицы доменных сущностей с таблицей процесса и выборка тех сущностей, по которым нет записи в таблице процесса.
Alexandr Fokin 1.2 67 )))
Alexandr Fokin 1.4 68 |(% style="width:177px" %)Инициализация, привязанная к дате.|(% style="width:993px" %)Обработчик привязан к конкретной дате и рассматривает некоторый ограниченный набор, например одни сутки относительно указанной даты.
Alexandr Fokin 1.1 69 Таким образом мы явно ограничиваем блок данных. Но нужно учесть сценарии с возникновением ошибки, т.к. следующее срабатывание уже будет на основе новой даты.
Alexandr Fokin 1.4 70 |(% style="width:177px" %)Перебор всего сета доменных сущностей.|(% style="width:993px" %)(((
Alexandr Fokin 1.2 71 Необходимое условие: Наличие способа перебрать данные батчами, гарантия что данные не удаляются.
Alexandr Fokin 1.1 72
Alexandr Fokin 1.3 73 Вариант 1:
Alexandr Fokin 1.2 74 Если мы уверены, что доменные объекты не удаляются, то мы можем отсортировать их по дате создания и первичному ключу. Таким образом мы получим фиксированные страницы данных, которые можно обрабатывать параллельно. Невозможно выполнить, если допускается удаление объектов.
75
Alexandr Fokin 1.3 76 Вариант 2:
77 Если есть уникальный автоинкреметный числовой ключ, то можно использовать его.
78
79 Вариант 3:
80 Если кол-во записей не очень велико и мы можем без проблем полностью уместить сет всех ключей в оперативной памяти.
Alexandr Fokin 1.9 81 (Не требует гарантии, что сущность нельзя удалить, т,к. в случае обнаружения удаления можно просто пропустить ключ).
Alexandr Fokin 1.3 82
Alexandr Fokin 1.2 83 Can queries that users ORDER BY using date to sort data be non deterministic?
84 [[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 85 )))
Alexandr Fokin 1.2 86 )))
87 )))
Alexandr Fokin 1.4 88 |(% style="width:15px" %) |(% style="width:1470px" %)
Alexandr Fokin 1.1 89
90