背景如下:我们有一个问题工单,要经过很多状态的流转实现工单的完成,在初期可以简单使用if-else去实现,但是基于一个扩展性而言,后续肯定要通过其他手段来实现工单的流转,避免硬编码以及性能上这些方面的问题

1. 业务需求如下

维度

场景

要求

生命周期

工单存在很多状态,并且可回退、可撤销

状态迁移必须可枚举、可校验

可扩展性

未来会新增等状态与动作

新增状态/事件不改动已有代码

可视化

产品和运营需要看懂流转规则

规则最好可配置、可文档化

一致性

多终端、多线程同时操作

不允许出现“幽灵状态”

2. 技术方案对比

维度

硬编码 if-else

工作流引擎(Flowable/Camunda)

状态机(Cola-StateMachine/Spring StateMachine)

核心思想

过程式判断

流程驱动

事件驱动(事件→状态迁移)

学习成本

低(Java DSL)

可视化

强(BPMN 图)

中(DSL 代码即文档)

扩展方式

为0

改 BPMN、重新部署

加状态、事件、处理器即可

性能

较重(DB 日志、历史表)

事务一致性

需手动保证

内嵌事务

与业务事务同域

适用场景

简单、少状态

复杂、长流程、多人审批

中等复杂、状态有限、需要高并发

对于我们的项目来说,流程驱动会导致很多额外的配置,每次新增或者删除都需要大改整体流程,我们更倾向于事件驱动,通过规则配置来实现状态迁移。并且工作流这种BPMN引擎天生就重,跟状态机这种框架的性能没法比。从整体考量,使用状态机是最好的选择

为什么工作流性能比状态机性能差那么多?

核心差距在于工作流引擎的持久化模型本身会记录很多信息,比如流程定义表、运行时执行表、历史活动节点、历史变量、历史意见等等信息,导致一次审批往往要制造7-10条数据,跨多张表并且需要落库,导致性能压力大

而状态机本身只记录状态,至于状态机定义、运行时的实例这些都是在java代码和内存中的,没有落库操作,状态机本身实际上不会去持久化任何信息,如果需要任何扩展性操作只需要在行为侧进行配置即可。因此状态机对比起工作流这种重量级引擎,大多数时候都是比较高效的

3. Java 生态状态机框架对比

框架

最新版本

性能

DSL 友好度

侵入性

社区活跃度

备注

Cola-StateMachine

v1.4.0

10M ops/s+

Fluent API,极简

零侵入

阿里维护,star 4.2k

单 Java 文件即可跑

Spring StateMachine

3.2.x

1M ops/s

基于注解、XML、YAML

与 Spring 强耦合

Pivotal 官方

功能全但重

Squirrel-Foundation

0.3.9

2M ops/s

Fluent API

需继承抽象类

个人维护,3 年未更新

风险高

Stateless4j

2.6.0

1M ops/s

Builder 模式

需要泛型定义

个人维护,star 1.1k

功能有限

4. 为什么最终选 Cola-StateMachine

理由

具体收益

极简

单依赖 < 200 KB;核心代码仅 8 个类;无需数据库表

高性能

纯内存实现,无反射;每次流转仅一次 Map 查找

零侵入

不依赖 Spring、不依赖注解;普通 POJO 即可

可测试

DSL 即文档,单元测试可以“一眼看穿”

可扩展

状态、事件、处理器均可插拔;支持嵌套状态机

阿里背书

在阿里内部多个核心系统(交易、履约)落地验证

5. 结论

  • 对于“状态有限、规则明确、高并发、短生命周期”的工单系统,状态机 > 工作流
  • 在 Java 生态中,Cola-StateMachine 以极简、高性能、零侵入胜出
  • 采用 Cola-StateMachine,可在 1 天 内完成核心流转开发,1 周 内上线生产。

从学习成本、扩展性、性能多方面考虑,最终采用Cola-StateMachine实现

Logo

火山引擎开发者社区是火山引擎打造的AI技术生态平台,聚焦Agent与大模型开发,提供豆包系列模型(图像/视频/视觉)、智能分析与会话工具,并配套评测集、动手实验室及行业案例库。社区通过技术沙龙、挑战赛等活动促进开发者成长,新用户可领50万Tokens权益,助力构建智能应用。

更多推荐