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