订单有限状态机架构设计

有限状态机 有限状态机(Finite-state machine, FSM),是表示有限个状态以及在这些状态之…

有限状态机

有限状态机(Finite-state machine, FSM),是表示有限个状态以及在这些状态之间的转移和动作等行为的数学模型。主要用来是描述对象在它的生命周期内所经历的状态序列,以及如何响应来自外界的各种事件。

状态机可归纳为4个要素,即现态、条件、动作、新态。其中“现态”和“条件”是因,“动作”和“次态”是果。

  1. **现态:**是指当前所处的状态。
  2. **事件:**又称为“条件”。当一个事件发生,将会触发一个动作,或者执行一次状态的迁移。
  3. **动作:**条件满足后执行的动作。动作执行完毕后,可以迁移到新的状态,也可以仍旧保持原状态。动作不是必需的,当条件满足后,也可以不执行任何动作,直接迁移到新状态。
  4. **次态:**条件满足后要迁往的新状态。“次态”是相对于“现态”而言的,“次态”一旦被激活,就转变成新的“现态”了。

例如,当订单处于“待动作”状态时,收到了支付平台的支付成功回调通知,这就是订单的现态和条件。这时候,系统会执行拆分订单、推送订单到供应链系统等操作,这就是“动作”。最后再把订单的状态标记为已完成,这就是这一次状态变更的“次态”。

按这个模式,整个订单系统的逻辑都可以抽象成为一系统的状态、状态变更的条件、状态变更的动作。

订单状态转移表

根据实际业务场景,按以下格式整理出一份订单的状态转移表。这里增加前置动作和后置动作两个概念,前置动作是指在修改状态之前要执行的动作,例如创建订单前需要锁定库存。执行一系列前置动作时,如果某个动作失败了,需要把前面的前置动作做回滚。后置动作是订单指的是转移到新状态后自动触发的事件,例如支付成功后的拆单和推送等。后置动作执行失败也不需要做回滚,但是需要加上重试机制。

当前状态 事件 前置动作 新状态 后置动作
未创建 确认下单 锁定库存
创建订单
待支付
待支付 支付成功 修改订单状态 拆分订单
推送订单
已支付
待支付 手动取消 修改订单状态 已取消
待支付 超时取消 修改订单状态 已取消

核心代码

状态定义

枚举定义全部的订单状态,订单状态应该尽量订得很细,即使两个状态之间只有细微的区别也可以分开来。因为在这个架构下,事件和动作都是可以重用的,不同的状态转移过程通过配置来区分就可以。

这里的示例是只用一个主状态字段来表示所有的订单状态,也可以分成把多种状态分别用不同的字段来表示,例如支付状态、发货状态、售后状态都用单独的字段和枚举变量。

事件定义

首先定义事件的枚举类

然后每个事件写一个类,继承事件基类

操作类

前置动作、后置动作、回滚操作都继承相同的基类OrderOperation,分别放到不同的目录下。

状态转移配置

首先用事件类型作为数组的key进行配置,对应的value是可以响应这个事件的状态列表,如果一个事件可能有多种状态转移方式,就需要配置多个状态定义。
状态的conditions是指可以响应这个Event的状态,配置的多个状态是“或”关系。

核心代码

本文来自网络,不代表软粉网立场,转载请注明出处:https://www.rfff.net/p/8210.html

作者: HUI

发表评论

您的电子邮箱地址不会被公开。

返回顶部