-
Notifications
You must be signed in to change notification settings - Fork 0
Control Flow
Поток выполнения обеспечивает инфраструктуру для выполнения процесса по данным (сообщениям). Т.к. все сообщения - это DTO, есть сильное предположение, что разбив сложный процесс на атомарные команды и фиксируя результат выполнения этих атомарных команд (в памяти или долговременно) можно создать связующий код, который, останется кодом (а не сложноструктурированными данными, наподобие BPMN), а с другой стороны - будет пригоден для интроспекции, сквозного и тотального управления через данные.
Обязанность потока управления - обеспечить выполнение команды с рядом свойств:
- идемпотентность - одна и та же команда при повторном вызове должна возвращать одинаковый результат, если не менялся агрегат в коллекции
- возможность управлять ЖЦ выполнения сложной команды
- ставить на паузу
- отменять выполнение
- повторно выполнять команду (в первую очередь - для исправления ошибок)
- откатывать изменения
- возможность внутренние команды выполнять с разными стратегиями
- бери из памяти, если нет - выполняй (последовательный процесс по данным)
- всегда выполняй (для захвата ресурсов)
Эти свойства, кроме прочего, позволят реализовать произвольное тестирование без моков.
Список возможных сочетаний в Memory:
- Command -> ControlEvent - выполняется действие ЖЦ
- InProgress - команда выполняется
- Paused - выполнение приостановлено
- WaitFor(by: Cmd, for: EventType) -> Command - команда не будет выполнена, WaitFor будет проброшен дальше как признак необходимости ожидать Event с типом EventType для завершения Command
- Retry(n) - попытка n выполнить команду
- Command -> Event - команда заверешна успешно с результатом
- Command -> Error - команда завершилась с ошибкой
- Command -> Command - запущено выполнение внутренней команды
Когда процесс встает в ожидание, текущее выполнение процесса завершается, а при получении подходящего Event - перезапускается заново, но на этот раз (многие) шаги процесса будут воспроизводится из Memory. Таким образом можно организовать
- хранение истории процесса, каждого его инстанса
- перезапуск определенных шагов процесса, которые нужно выполнять каждый раз (получение/освобождение Lock, открытие/закрытие Tx)
- продолжение процесса без потери итогового состояния, но при этом если необходимый шаг упал - возможность сделать retry, rollback или reset