Skip to content

Control Flow

Gennady Lebedev edited this page May 24, 2020 · 2 revisions

Поток выполнения обеспечивает инфраструктуру для выполнения процесса по данным (сообщениям). Т.к. все сообщения - это 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

Clone this wiki locally