Исходный код вики Выполнение процесса
Редактировал(а) Alexandr Fokin 2024/06/12 15:27
Скрыть последних авторов
author | version | line-number | content |
---|---|---|---|
![]() |
1.12 | 1 | |(% style="width:131px" %) |(% style="width:1307px" %)[[Блокировки>>doc:Архитектура и модели.Блокировки.WebHome]] |
![]() |
1.1 | 2 | |(% style="width:131px" %)Типы этапов|(% style="width:1307px" %)((( |
3 | |(% style="width:204px" %)Автоматическая обработка|(% style="width:1084px" %) | ||
4 | |(% style="width:204px" %)Ожидание события|(% style="width:1084px" %)Сообщение от внешней системы. | ||
5 | Ручной ввод от пользователя. | ||
6 | Ожидание некой даты. | ||
7 | И др. | ||
8 | ))) | ||
9 | |(% style="width:131px" %)Консистентность|(% style="width:1307px" %)((( | ||
10 | | |При обработке процесса важно гарантировать, что один и тот-же экземпляр процесса в один момент времени обрабатывается одним обработчиком. | ||
![]() |
1.11 | 11 | | |Гарантировать, что обработчик при обработке содержит у себя актуальное состояние процесса, и никто другой не модифицирует его до окончания работы обработчика (если не предполагаем возможность оптимистичной блокировки с retry). |
![]() |
1.1 | 12 | | |((( |
![]() |
1.11 | 13 | Гарантировать, что обработчик перед внесением изменений убедился, что процесс находится на нужном шаге. |
![]() |
1.1 | 14 | |
15 | Ситуация 1. | ||
![]() |
1.4 | 16 | Нам поступило сообщение от внешней системы, по которому мы должны продолжить некоторый экземпляр процесса. Мы берем это экземпляр и перед обработкой проверяем его статус. Если вдруг обнаружилось, что статус некорректный, то это обозначает что возникла ошибка. |
![]() |
1.12 | 17 | Например это может быть вызвано задвоением при отправки сообщений от внешней системы ([[Dual write problem>>doc:Архитектура и модели.Группа\. Распределенные системы.Распределенные системы\. Консистентность.Dual write problem.WebHome]]), если при взаимодействии мы не используем подход с уникальной идентификацией сообщений. Ранее приходил первый экземпляр этого сообщения и процесс уже продолжил свое выполнение далее, но вот поступил второй экземпляр того-же сообщения, и мы фиксируем что процесс не находится в нужном состоянии для его обработки. При этом у нас есть возможность реализовать это таким образом, что мы не повредим консистентность процесса. |
![]() |
1.7 | 18 | Момент с уникальной идентификацией заявок, также относиться и к инициализации процесса на основании события. |
![]() |
1.1 | 19 | |
20 | Ситуация 2. | ||
![]() |
1.8 | 21 | Два пользователя открыли форму ручного ввода данных для процесса. Первый пользователь указал данные и продолжил процесс. Второй пользователь пытается проделать то-же самое, но получает ошибку о том, что его форма устарела и кто-то другой внес изменений, на текущем этапе невозможно выполнить данный ручной ввод |
22 | (может быть обнаружено либо по RowVersion, либо по статусу процесса). | ||
![]() |
1.1 | 23 | ))) |
24 | ))) |