前言
在平常的后端项目开发中,状态机模式的使用其实没有大家想象中那么常见,笔者之前由于不在电商领域工作,很少在业务代码中用状态机来管理各种状态,一般都是手动get/set状态值。去年笔者进入了电商领域从事后端开发。电商领域,状态又多又复杂,如果仍然在业务代码中东一块西一块维护状态值,很容易陷入出了问题难于Debug,难于追责的窘境。
碰巧有个新启动的项目需要进行订单状态的管理,我着手将Spring StateMachine接入了进来,管理购物订单状态,不得不说,Spring StateMachine全家桶的文档写的是不错,并且Spring StateMachine也是有官方背书的。但是,它实在是太”重“了,想要简单修改一个订单的状态,需要十分复杂的代码来实现。具体就不在这里展开了,不然我感觉可以吐槽一整天。
说到底Spring StateMachine上手难度非常大,如果没有用来做重型状态机的需求,十分不推荐普通的小项目进行接入。
最最重要的是,由于Spring StateMachine状态机实例不是无状态的,无法做到线程安全,所以代码要么需要使用锁同步,要么需要用Threadlocal,非常的痛苦和难用。 例如下面的Spring StateMachine代码就用了重量级锁保证线程安全,在高并发的互联网应用中,这种代码留的隐患非常大。
private synchronized boolean sendEvent(Message message, OrderEntity orderEntity) {
boolean result = false;
try {
stateMachine.start();
// 尝试恢复状态机状态
persister.restore(stateMachine, orderEntity);
// 执行事件
result = stateMachine.sendEvent(message);
// 持久化状态机状态
persister.persist(stateMachine, (OrderEntity) message.getHeaders().get("purchaseOrder"));
} catch (Exception e) {
log.error("sendEvent error", e);
} finally {
stateMachine.stop();
}
return result;
}
吃了一次亏后,我再一次在网上翻阅各种Java状态机的实现,有大的开源项目,也有小而美的个人实现。结果在COLA架构中发现了COLA还写了一套状态机实现。COLA的作者给我们提供了一个无状态的,轻量化的状态机,接入十分简单。并且由于无状态的特点,可以做到线程安全,支持电商的高并发场景。
COLA是什么?如果你还没听说过COLA,不妨看一看我之前的文章,传送门如下:
https://mp.weixin.qq.com/s/07i3FjcFrZ8rxBCACgeWVQ
如果你需要在项目中引入状态机,此时此刻,我会推荐使用COLA状态机。
COLA状态机介绍
COLA状态机是在Github开源的,作者也写了介绍文章:
https://blog.csdn.net/significantfrank/article/details/104996419
官方文章的前半部分重点介绍了DSL(Domain Specific Languages),这一部分比较抽象和概念化,大家感兴趣,可以前往原文查看。我精简一下DSL的主要含义:
什么是DSL? DSL是一种工具,它的核心价值在于,它提供了一种手段,可以更加清晰地就系统某部分的意图进行沟通。