Процесс - Выполнение процесса 

Page / - Изменено Alexandr Fokin в 2024/01/11 13:28 

Выполнение процесса 
Изменено Alexandr Fokin
в 2024/01/11 13:28

Оглавление

 	Блокировки	
Типы этапов	Автоматическая обработка	 	
Ожидание события	Сообщение от внешней системы.
Ручной ввод от пользователя.
Ожидание некой даты.
И др.	
	
Консистентность	 	При обработке процесса важно гарантировать, что один и тот-же экземпляр процесса в один момент времени обрабатывается одним обработчиком.	
 	Гарантировать, что обработчик при обработке содержит у себя актуальное состояние процесса, и никто другой не модифицирует его до окончания работы обработчика (если не предполагаем возможность оптимистичной блокировки с retry).	
 	Гарантировать, что обработчик перед внесением изменений убедился, что процесс находится на нужном шаге. 
Ситуация 1.
Нам поступило сообщение от внешней системы, по которому мы должны продолжить некоторый экземпляр процесса. Мы берем это экземпляр и перед обработкой проверяем его статус. Если вдруг обнаружилось, что статус некорректный, то это обозначает что возникла ошибка.
Например это может быть вызвано задвоением при отправки сообщений от внешней системы (Dual write problem), если при взаимодействии мы не используем подход с уникальной идентификацией сообщений. Ранее приходил первый экземпляр этого сообщения и процесс уже продолжил свое выполнение далее, но вот поступил второй экземпляр того-же сообщения, и мы фиксируем что процесс не находится в нужном состоянии для его обработки. При этом у нас есть возможность реализовать это таким образом, что мы не повредим консистентность процесса.
Момент с уникальной идентификацией заявок, также относиться и к инициализации процесса на основании события.
Ситуация 2.
Два пользователя открыли форму ручного ввода данных для процесса. Первый пользователь указал данные и продолжил процесс. Второй пользователь пытается проделать то-же самое, но получает ошибку о том, что его форма устарела и кто-то другой внес изменений, на текущем этапе невозможно выполнить данный ручной ввод
(может быть обнаружено либо по RowVersion, либо по статусу процесса).