1 引言
任务通常有多种状态,通过特定条件触发状态流转,条件一般是用户完成某些行为,并且当用户完成任务时还会发放奖励。或许一开始简单的任务模块就能支撑,但是随着越来越多的运营活动出现的时候,代码就会开始不断堆积变得难以维护,任务状态的流转甚至变得不可控,开发成本直线上升,因此需要一个易于扩展可读性高的任务状态机。
目前有一些较为流行的状态机选择:Spring Statemachine、Squirrel statemachine和cola-component-statemachine等,但是引入状态机组件会使得系统变得更复杂并且扩展性不高,比如需要考虑调整业务逻辑去适配状态机,而不只是利用状态机简化业务逻辑。基于此考虑使用模板方法+事件驱动设计一个简单的任务状态机。
2 任务状态机设计
2.1 任务状态机核心模块:任务、任务模板和行为
任务
任务是最核心的模块,记录每个用户当前的参与状态。任务包含状态和事件,状态即用户任务当前所处的阶段,比如未绑定、待开启、进行中、待领奖和已完成这些阶段。事件即状态流转事件,每一个事件会关联一个或多个起始状态以及一个唯一的目标状态。由事件触发任务状态的流转,通过发布事件匹配事件处理器来完成相应的事件处理逻辑。
任务模板
任务模板是任务的配置中心,通过模板为用户自动生成任务。模板定义了任务的基本属性,包括任务名称、行为到事件的映射、完成任务的通知和完成任务的奖励等等。此外可以通过定义场景将多个模板组织起来,每个场景可以包含多个模板。
行为
即用户的行为的抽象,比如支付订单
2.2 模板方法实现事件处理器
事件处理器有五个要素:可处理事件、任务源状态、任务目标状态、条件检查和状态流转。事件处理器接口定义如下:
public interface StatusHandler {
boolean canHandleEvent(Byte eventCode);
Set<Byte> fromStatus();
Byte toStatus();
boolean checkCondition(TaskContext ctx);
void transitionStatus(Byte eventCode, TaskContext ctx);
}
可以灵活配置事件处理器,比如绑定任务处理器、开始任务处理器和完成任务处理器等等,类图如下:

文章介绍了如何设计一个任务状态机,以解决复杂运营活动中任务状态管理的问题。通过任务、任务模板和行为三个核心模块,结合模板方法和事件驱动的方式,实现任务状态的流转。事件处理器接口定义了处理事件的逻辑,而事件驱动则在用户行为上报时触发状态变化。状态机设计允许灵活扩展,能适应不同的任务状态和流转规则。
最低0.47元/天 解锁文章
5951

被折叠的 条评论
为什么被折叠?



