Ручной и автоматический запуск процесса
Автоматический запуск
по таймеру (по выборке) 
Ручной запуск
По сущности (ключу) 
По групповой выборке (список ключей) 
По групповой выборке с параметрами 
Запуск по событию
По сущности (ключу) 
По групповой выборке (список ключей) 
По групповой выборке с параметрами 
Валидация перед запуском
  • Валидация доменных объектов на возможность запуска экземпляра процесса (с гарантией, что доменной объект не будет изменен до конца транзакции планировщика, иначе мы можем принять некорректное решение о запуске процесса).
  • В случае использования Оптимистичная блокировка, необходимо также гарантировать инкрементацию ключа доменных сущностей т.к. скорее всего их поля не изменятся напрямую.
  • Как вариант - использование более строго уровня изоляции.

Если существуют предыдущие экземпляры процесса (по ключевому набору), то они также валидируются на возможность запуска нового экземпляра

Отношение экземпляров процесса и ключевых доменных сущностей.
Допускается создание только одного экземпляра процессаЭкземпляр ключевой доменной сущности <-(1 к 1)-> Экземпляр процесса.
Для каждого уникального ключа может быть не более 1 экземпляра процесса.
Допускается создание более одного экземпляра

Здесь речь идет не о том, что несколько экземпляров активны в один и тот-же момент времени, а о том, что допускается ситуация, что в случае если у нас уже есть существующий экземпляр процесса (выполнявшийся ранее), мы не меняем его состояние и перезапускаем, а создаем новый экземпляр (при этом гарантируя валидность такого действия).

В таком случае мы можем представить следующую модель данных:
Ключевые доменные сущности <-(1 к 1)-> Ключевой сквозной контекст процесса <-(1 к N)-> Экземпляр процесса.
 

Ключевой сквозной контекст не всегда может быть выражен явно, но фактически он будет существовать.

Пример 1

Мы можем гарантировать, что в один момент времени имеется только один активный экземпляр процесса (и только он выполняется).

Мы можем использовать указатель на активный процесс из сквозного контекста,
или также мы можем добавить флажок активности в экземпляр процесса и наложить на него уникальный индекс.

Пример 2

Сквозной контекст может отслеживать была ли достигнута финальная цель ключевой связки.

Например:

  • Целью является создание некоторого доменного объекта, когда он будет создан, информация зафиксируется в сквозном контексте.
  • Эти данные не позволят запустить новый экземпляр процесса так как цель достигнута - объект создан.
  • Если вдруг выясняется, что по какой-то причине созданный доменный объект объявляется недействительным, и необходимо запустить новый экземпляр процесса (по тому же ключу) для создания нового экземпляра доменного объекта, то также нужно выполнить сброс данных в сквозном контексте.
    (ручной сброс или подписка на доменной событие, оповещающее о смене статуса созданного объекта (аннулирование, блокировка и др.))
  
На основе событияСобытие запуска процесса поступает извне, и обязательства о выборке данных для процесса лежат на внешнем компоненте.
События могут помещаться в некоторый буфер - хранилище (брокер сообщений, БД) и разбираться обработчиком до исчерпания.
На основе данных
Замечания
ПараллелизмГарантия, что код планировщика выполняются в эксклюзивном режиме, в случае если он запущен в нескольких экземплярах.
Предполагается Пессимистичная блокировка на уровне всех экземпляров.
Тип 
Выборка до исчерпания

Выборка данных до тех пор пока они не исчерпаются.

Замечания:

  • Плохо подходит для больших объемов данных. Может привести к долгому выполнению выборки. 
  • Плохо подходит для сложных условий т.к. может привезти к тому, что будет невозможно выразить полный набор условий в виде запроса или запрос получиться сложным и также будет долго выполняться.
  • Если при обработке ключевого доменного объекта возникнет ошибка, то это окажет влияние на всю операцию инициализации. Может быть проблематично отбросить данный доменный объект, чтобы он не попал в выборку.

Пример:
Соединение таблицы доменных сущностей с таблицей процесса и выборка тех сущностей, по которым нет записи в таблице процесса.

Инициализация, привязанная к дате.Обработчик привязан к конкретной дате и рассматривает некоторый ограниченный набор, например одни сутки относительно указанной даты.
Таким образом мы явно ограничиваем блок данных. Но нужно учесть сценарии с возникновением ошибки, т.к. следующее срабатывание уже будет на основе новой даты.
Перебор всего сета доменных сущностей.
 ПагинацияПараллелизмФильтрация сета 
 Страницы+- 
 Смещение-+ 

Необходимое условие: Наличие способа перебрать данные сета данных.
Вариант 1: Если перебираем записи без использования параллелизма, то нам достаточно организовать некоторую пагинацию и последовательно идти, обрабатывая подходящие для запуска процесса строки.

Вариант 2:
Если мы уверены, что доменные объекты не удаляются, то мы можем отсортировать их по дате создания и первичному ключу (Если есть уникальный автоинкреметный числовой ключ, то можно использовать его).
Таким образом мы получим детерминированные страницы данных, которые даже можно обрабатывать параллельно.
Невозможно выполнить, если допускается удаление объектов т.к. оно может изменить данные в страницах.
Либо можно прикинуть вариант, когда мы используем блокировку доменных объектов через БД, таким образом в каждом обрабатываем батче (в один момент времени) будет уникальный набор доменных объектов, и если один и тот же объект попадет в разные батчи, то в первом случае он обработается, а во втором он будет отброшен (есть вероятность, что некоторые строки, существовавшие на момент начала операции, не попадут в выборку).

Вариант 4:
Если кол-во записей не очень велико и мы можем без проблем полностью уместить сет всех ключей в оперативной памяти.
(Не требует гарантии, что сущность нельзя удалить, т,к. в случае обнаружения удаления можно просто пропустить ключ).

Пагинация | Paging

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

  

 

Теги: