Практическое использование конечного автомата Cola-StateMachine
Практическое использование конечного автомата Cola-StateMachine

Предисловие

В сфере электронной коммерции,Многие предприятия имеют состояние,И эти состояния объектов многочисленны и сложны. Метод жесткого кодирования больше не подходит для управления нынешним сложным бизнес-объектостоянием. Чтобы адаптироваться к сложному и меняющемуся бизнесу,Можетиспользоватьгосударственная машина для управления состоянием, унификация потока определения бизнес-объектсостояния. Далее в этой статье речь пойдет о государственной Понятия, связанные с машинами Сценарии использования。

определение

Прежде чем представить конечный автомат, давайте представим рабочий процесс (WorkFlow). Новички обычно легко путают эти два понятия. Рабочий процесс (WorkFlow) обычно относится к автоматизации бизнес-процессов (полностью или частично) в среде компьютерных приложений. Это описание рабочего процесса и бизнес-правил между каждым этапом операции. В компьютерных системах рабочий процесс является частью совместной работы, поддерживаемой компьютером (CSCW).

Конечный автомат — это тип рабочего процесса (WorkFlow), включающий последовательный рабочий процесс (Sequential) и рабочий процесс конечного автомата (State Machine). Конечный автомат — это аббревиатура конечного автомата, который представляет собой математическую модель, абстрагированную от правил работы реальных вещей.

Кратко объясните разницу между двумя концепциями конечного автомата и блок-схемы. Конечный автомат используется для описания всех возможных состояний конкретного объекта, а также переходов между состояниями, вызванных возникновением различных событий. Блок-схема используется для представления различных действий по завершению чего-либо, и ключевым моментом является каждый шаг.

Конечный автомат (WorkFlow)

Рабочий процесс (конечный автомат)

Сосредоточьтесь на одной задаче

Обратите внимание на поток статусов

нет цикла

Циклы могут быть легко реализованы

Просто реализовать

Это довольно хлопотно, нужно фиксировать текущий статус задачи

Последовательное выражение, не очень гибкое

Более гибкое выражение

Высокие продажи

Низкая эффективность, можно распараллелить

Выбор конечного автомата

Механизмами процессов легко злоупотребить, но конечные автоматы практичны и широко используются, главным образом, по следующим двум причинам:

  1. выполнить. Самая простая и легкая государственная машинаиспользуйте один Enum Этого можно достичь, по сути, с нулевыми затратами.
  2. использоватьгосударственная машинаиз DSL выражатьсостояниеобращение,Семантика станет яснее,Это повысит читаемость и удобство сопровождения кода.

Однако, когда бизнес-сценарий становится более сложным, он все равно выйдет за рамки Enum, поддерживающего только линейный поток состояний, поэтому нам придется рассмотреть конечные автоматы с открытым исходным кодом.

Я сосредоточился на реализации двух механизмов конечных автоматов: одного — Spring StateMachine, а другого — Squirrel StateMachine. Их преимуществом является то, что их функции очень полны, а недостатком — то, что их функции очень полны.

Что касается реальных проектов (на самом деле большинство проектов именно такие), то на самом деле нет необходимости во многих продвинутых способах игры с конечными автоматами: таких как вложенность состояний (Substate), параллелизм состояний (Parallel, Fork, Присоединяйтесь), подгосударственные машины и т. д. подождите.

А большинство конечных автоматов с открытым исходным кодом имеют состояние и реализованы с использованием распределенной многопоточности, что не позволяет обеспечить потокобезопасность, и в коде необходимо использовать синхронизацию блокировок. Каждый раз, когда конечный автомат получает запрос, он должен перестроить новый экземпляр конечного автомата, что приводит к снижению производительности конечного автомата с открытым исходным кодом.

преимущество

недостаток

Spring StateMachine

1. Мощное управление жизненным циклом

1. Кривая обучения крутая

2. Легко интегрироваться

2. Может увеличить сложность проекта.

3. Хорошая документация и поддержка сообщества 2.

Squirrel StateMachine

1.Легкий

1. Функции относительно ограничены

2. Простой и удобный в использовании

3. Высокая производительность

Cola-StateMachine

1. Высокая масштабируемость

1. Относительно мало документации и поддержки сообщества.

2. Четкая семантика и высокая читаемость.

3. Безопасность резьбы

В конце концов я выбрал Cola-StateMachine, движок конечного автомата с открытым исходным кодом.

Введение в Cola-StateMachine

Компонент конечного автомата структуры COLA — это небольшая, без сохранения состояния, простая, легкая и чрезвычайно высокопроизводительная реализация DSL конечного автомата, которая решает проблему потока состояний в бизнесе.

Cola-StateMachine используется Internal DSL Конкретное использование такого универсального языка, при этом DSL Написанные программы имеют стиль родного языка, который отличается от основного языка, на котором они написаны. Кола-Государственная Машина использовать Java Это самая простая реализация с самой низкой стоимостью реализации, но она не поддерживает «внешнюю конфигурацию».

Основные концепции Cola-StateMachine:

  1. Штат: штат
  2. Событие: событие, состояние вызывается событием, вызывающим изменения.
  3. Переход: поток, указывающий из одного состояния в другое состояние.
  4. Внешний переход: внешний поток, поток между двумя разными состояниями.
  5. Внутренний переход: внутренний поток, поток между одним и тем же состоянием.
  6. Условие: условие, определяющее, разрешено ли достижение определенного состояния.
  7. Действие: действие, что можно сделать после достижения определенного состояния.
  8. StateMachine: состояние

Режим работы Cola-statemachine

Основной код Cola-StateMachine

Язык кода:javascript
копировать
builder.externalTransition()
  .from(States.STATE1)
  .to(States.STATE2)
  .on(Events.EVENT1)
  .when(checkCondition())
  .perform(doAction());

Практическое использование

Сценарии использования

При разработке модуля заказов системы электронной коммерции заказы будут включать различные состояния, а передача между состояниями будет в центре внимания разработчиков.

Статус заказа включает в себя: инициализация, ожидающий платеж, ожидающий заказ, ожидающая отгрузки, ожидающая получения...

События заказа включают: создание заказа, успешную оплату, получение заказа, доставку, отмену заказа...

Необходимо рассмотреть следующие вопросы:

  1. Когда статус заказа повышается, как внести как можно меньше изменений или внести изменения, мало влияющие на историю?
  2. Если вызван из той же записи,Каждый метод обработки требует разных входных параметров.,Как с этим справиться?
  3. Возможно, что определенный,Логика обработки на разных платформах (сторона покупателя, серверная часть продавца, платформа управления) также несколько различается.,Как с этим справиться?

Поскольку заказ предполагает много переводов, мы выбираем использовать государственную машина двигателя для выражения состояния потока. Потому что государственная машина DSL Выразительная способность, обусловленная if-else Код должен быть более элегантным и простым для понимания. С другой стороны, конечные автоматы просты и не так примечательны, как процессоры процессов.

1. Введение зависимостей

Шаг 1. Введение зависимостей

Язык кода:javascript
копировать
  <dependency>
    <groupId>com.alibaba.cola</groupId>
    <artifactId>cola-component-statemachine</artifactId>
    <version>4.2.1</version>
  </dependency>
2. Базовая конфигурация заказа

Шаг 2:определениегосударственная машина Средние базовые атрибуты:состояние、время、государственная машина. В этой практике использовать OrderStatusEnum определение Заказсостояние,использовать OrderEventParamопределение Заказсобытие,использовать OrderStateMachineIdEnum определениегосударственная машина。

Язык кода:javascript
копировать
  //Заказсостояние  public enum OrderStatusEnum {
    ИНИТ("Инициализация", 0),
    PAY_ONLINE("Ожидание платежа", 1),
    WAITING_FOR_RECEIVED("Ожидание заказа", 2),
    WAITING_DELIVERY("Ожидание отправки", 3),
    PART_DELIVERY("Частичная доставка", 4),
    DELIVER_ALL("К получению", 5),
    ПОЛУЧЕНО("Получено", 6),
    ГОТОВО("Готово", 7),
    ОТМЕНА("Закрыть",8);
  }

  //Заказсобытие  public enum OrderEventEnum {
    CREATE_ORDER(1, «Создать заказ»),
    REPAY(2, "платить"),
    CANCEL_ORDER(3, «Отменить заказ»),
    TAKE_ORDER(4, «принимаю заказы»),
    REJECT_ORDER(5, «Отклонить заказ»), 
    DELIVERY_PART(6, «Частичная доставка»),
    DELIVERY_ALL(7, "все отправлено"),
    CONFIRM_RECEIPT(8, «подтвердить получение товара»),
    EXTEND_RECEIPT(9, «Расширенная доставка»),
    COMPLETE(10, «Транзакция завершена»);
  }

  //Заказгосударственная машинаID перечислять
  public enum OrderStateMachineIdEnum {
    ORDER_OF_SALE("ORDER_OF_SALE",
    OrderBizEnum.SALE_ORDER,"Заказгосударственная машина");
  }
3. Государственный автомат обращения заказов

Третий шаг: определение порядка состояния потока событий. Бетониспользование Builder и Fluent Interface способ обеспечить порядок вызовов кода. Например, в From может вызвать To только после , таким образом гарантируя, что государственная машина построения семантической корректности и связности. Мы используемгосударственную машина Builder,Подтвердить состояние Переходный режим (Переход),перениматьсостояние(From),определениедействие(On),Проверить состояние (когда),осуществлятьсобытие(Perform),Затем верните целевое состояние (To).

Когда добавляется новое событие заказа, просто добавьте соответствующее событие в этот конечный автомат и в то же время сохраните связь между событием заказа и методом реализации события.

Язык кода:javascript
копировать
  public class OrderOfSaleStateMachine implements OrderStateMachine {
    public void initialize() {

       //верногосударственная машина начинает сборку и регистрируется в StateMachineFactory
       StateMachineBuilder<OrderStatusEnum, OrderEventEnum, OrderContext> builder
       = StateMachineBuilderFactory.create();

       /**
       * Создать заказ: инициализация -> Платить
       * externalTransition : Строитель для потока
       */
       builder.externalTransition().from(OrderStatusEnum.INIT).to(OrderStatusEnum.PAY_ONLINE)
       .on(OrderEventEnum.CREATE_ORDER).when(checkOrder()).perform(createOrderAction);

       /**
       * Частичная доставка: Частичная доставка
       * internalTransition : Внутреннее кровообращение
       */
       builder.internalTransition()
       .within(OrderStatusEnum.PART_DELIVERY)
       .on(OrderEventEnum.DELIVERY_PART)
       .when(checkOrder())
       .perform(deliverOrderAction);

       /**
       * Отменить заказ: Платить、Ожидание Отправление, ожидаю получения -> Платить
       * externalTransitions : Построитель для нескольких потоков
       */
       builder.externalTransitions()
       .fromAmong(OrderStatusEnum.PAY_ONLINE,OrderStatusEnum.WAITING_FOR_RECEIVED,                                      OrderStatusEnum.WAITING_DELIVERY)
       .to(OrderStatusEnum.CANCEL)
       .on(OrderEventEnum.CANCEL_ORDER)
       .when(checkOrder())
       .perform(cancelOrderAction);


       // Описание: кола statemachine После сборки он автоматически StateMachineFactory зарегистрироваться.
       // После успешного строительства, по данным StateMachineFactory.get(machineId) получатьгосударственная машина, повторная сборка не разрешена, и повторная сборка сообщит об ошибке.
       builder.build(this.getStateMachineIdEnum().getMachineId());
    }

    @Override
    public OrderStateMachineIdEnum getStateMachineIdEnum() {
        return OrderStateMachineIdEnum.ORDER_OF_SALE;
    }
4. Единое начальное состояние - внешний поток состояний
Язык кода:javascript
копировать
  /*
   * Установите построитель внешнего типа escape-состояния и установите from\to\on\when\perform
   */
  builder.externalTransition()
    .from(OrderStatusEnum.INIT)
    .to(OrderStatusEnum.PAY_ONLINE)
    .on(OrderEventEnum.CREATE_ORDER)
    .when(checkOrder())
    .perform(createOrderAction);

Описание: Начальным статусом заказа является «Инициализация». При возникновении события «Создать заказ» выполняется escape-код. При выполнении CheckCondition выполняется CreateOrderAction.

Язык кода:javascript
копировать
  public class CreateOrderAction implements Action<OrderStatusEnum, OrderEventEnum, OrderContext> {
    @Override
    public void execute(OrderStatusEnum from, OrderStatusEnum to, OrderEventEnum event, OrderContext context) {
      // ...
      // 1.получатьгосударственная машина
      StateMachine<OrderStatusEnum, OrderEventEnum, OrderContext> stateMachine = getStateMachine();
      // 2.Группагосударственная машина messageContext
      OrderContext orderContext = buildContext();
      // 3.государственная машинасобытиекурок      stateMachine.fireEvent(OrderStatusEnum.INIT, OrderEventEnum.CREATE_ORDER, orderContext);
      // ...
    }
  }

Описание: CreateOrderAction реализует создание событий заказа и запускает события конечного автомата через StateMachine.FireEvent.

5. Внутренний поток состояний
Язык кода:javascript
копировать
  /**
   * Частичная доставка: Частичная доставка
   * internalTransition : Внутреннее кровообращение
   */
  builder.internalTransition()
    .within(OrderStatusEnum.PART_DELIVERY)
    .on(OrderEventEnum.DELIVERY_PART)
    .when(checkOrder())
    .perform(deliverOrderAction);

Описание: Начальный статус заказа находится в состоянии частичной доставки. При доставке выполняется поток состояния. При выполнении условия CheckCondition (условие частичной доставки заказа) выполняется действие DeliverOrderAction. возвращается статус: частичная доставка.

6. Множественные начальные состояния – внешняя передача состояния.
Язык кода:javascript
копировать
  /**
   * Отменить заказ: Платить、Ожидание Отправление, ожидаю получения -> Платить
   * externalTransitions : Построитель для нескольких потоков
   */
  builder.externalTransitions()
    .fromAmong(OrderStatusEnum.PAY_ONLINE,OrderStatusEnum.WAITING_FOR_RECEIVED,OrderStatusEnum.WAITING_DELIVERY)
    .to(OrderStatusEnum.CANCEL)
    .on(OrderEventEnum.CANCEL_ORDER)
    .when(checkOrder())
    .perform(cancelOrderAction);

Описание: Начальный статус заказа: ожидающий платеж, ожидающий отгрузки или ожидающий поступления. Когда происходит событие отмены заказа и выполняется CheckCondition, выполняется CancelOrderAction и возвращается статус CANCEL_ORDER.

краткое содержание

Cola-StateMachine Как проект с открытым исходным кодом Alibaba. COLA Самая большая особенность легковесного компонента конечного автомата заключается в том, что он не имеет состояния и использует чистый Java осознавать, использовать Fluent Interface (согласованный интерфейс)определениесостояниеисобытие,Доступен для управлениясостояниепереключить сцену。например:Заказсостояние、платитьсостояние Простой и ограниченныйсостояниесцена。

Ссылки

https://blog.csdn.net/significantfrank/article/details/104996419

https://www.jianshu.com/p/895047a04ae5

https://blog.csdn.net/qq_28959087/article/details/118359809

boy illustration
RasaGpt — платформа чат-ботов на основе Rasa и LLM.
boy illustration
Nomic Embed: воспроизводимая модель внедрения SOTA с открытым исходным кодом.
boy illustration
Улучшение YOLOv8: EMA основана на эффективном многомасштабном внимании, основанном на межпространственном обучении, и эффект лучше, чем у ECA, CBAM и CA. Малые цели имеют очевидные преимущества | ICASSP2023
boy illustration
Урок 1 серии Libtorch: Тензорная библиотека Silky C++
boy illustration
Руководство по локальному развертыванию Stable Diffusion: подробные шаги и анализ распространенных проблем
boy illustration
Полностью автоматический инструмент для работы с видео в один клик: VideoLingo
boy illustration
Улучшения оптимизации RT-DETR: облегченные улучшения магистрали | Support Paddle облегченный rtdetr-r18, rtdetr-r34, rtdetr-r50, rtdet
boy illustration
Эксклюзивное оригинальное улучшение YOLOv8: собственная разработка SPPF | Деформируемое внимание с большим ядром (D-LKA Attention), большое ядро ​​​​свертки улучшает механизм внимания восприимчивых полей с различными функциями
boy illustration
Создано Datawhale: выпущено «Руководство по тонкой настройке развертывания большой модели GLM-4»!
boy illustration
7B превышает десятки миллиардов, aiXcoder-7B с открытым исходным кодом Пекинского университета — это самая мощная модель большого кода, лучший выбор для корпоративного развертывания.
boy illustration
Используйте модель Huggingface, чтобы заменить интерфейс внедрения OpenAI в китайской среде.
boy illustration
Оригинальные улучшения YOLOv8: несколько новых улучшений | Сохранение исходной информации — алгоритм отделяемой по глубине свертки (MDSConv) |
boy illustration
Второй пилот облачной разработки | Быстро поиграйте со средствами разработки на базе искусственного интеллекта
boy illustration
Бесшовная интеграция, мгновенный интеллект [1]: платформа больших моделей Dify-LLM, интеграция с нулевым кодированием и встраивание в сторонние системы, более 42 тысяч звезд, чтобы стать свидетелями эксклюзивных интеллектуальных решений.
boy illustration
Решенная Ошибка | Загрузка PyTorch медленная: TimeoutError: [Errno 110] При загрузке факела истекло время ожидания — Cat Head Tiger
boy illustration
Brother OCR, библиотека с открытым исходным кодом для Python, которая распознает коды проверки.
boy illustration
Новейшее подробное руководство по загрузке и использованию последней демонстрационной версии набора данных COCO.
boy illustration
Выпущен отчет о крупной модели финансовой отрасли за 2023 год | Полный текст включен в загрузку |
boy illustration
Обычные компьютеры также могут работать с большими моделями, и вы можете получить личного помощника с искусственным интеллектом за три шага | Руководство для начинающих по локальному развертыванию LLaMA-3
boy illustration
Одной статьи достаточно для анализа фактора транскрипции SCENIC на Python (4)
boy illustration
Бросая вызов ограничениям производительности небольших видеокарт, он научит вас запускать большие модели глубокого обучения с ограниченными ресурсами, а также предоставит полное руководство по оценке и эффективному использованию памяти графического процессора!
boy illustration
Команда Fudan NLP опубликовала 80-страничный обзор крупномасштабных модельных агентов, в котором в одной статье представлен обзор текущего состояния и будущего агентов ИИ.
boy illustration
[Эксклюзив] Вы должны знать о новой функции JetBrains 2024.1 «Полнострочное завершение кода», чтобы решить вашу путаницу!
boy illustration
Краткое изложение базовых знаний о регистрации изображений 1.0
boy illustration
Новейшее подробное руководство по установке и использованию библиотеки cv2 (OpenCV, opencv-python) в Python.
boy illustration
Легко создайте локальную базу знаний для крупных моделей на основе Ollama+AnythingLLM.
boy illustration
[Решено] ошибка установки conda. Среда решения: не удалось выполнить первоначальное зависание решения. Повторная попытка с помощью файла (графическое руководство).
boy illustration
Одна статья поможет вам понять RAG (Retrival Enhanced Generation) | Введение в концепцию и теорию + практику работы с кодом (включая исходный код).
boy illustration
Эволюция архитектуры шлюза облачной разработки
boy illustration
Docker и Kubernetes [Разработка контейнерных приложений с помощью Python]