写作目的
好久没有写博客进行输出了,是时候需要水一篇了,嘻嘻。
正好项目中使用了状态机,也借此分享一下系统中状态机的项目落地经验。
什么是状态机
以在某宝下单为例,在点击下单后,此时订单就已经创建了,处于待支付状态,支付成功后变为带发布,收货成功后变为完成。其实一个订单的的状态是可穷举且状态流转是固定的,比如待收货的订单只能从支付成功来。
解决方案
我们还是以订单状态流转为例进行分析,当然SpringBoot提供了状态机解决方案。但是还有另一种的状态机解决方案:基于binlog实现状态机
如上图所示,任何动作仅仅是关注一个动作。以支付为例,当用户支付成功后,核心动作仅仅是把DB里订单的动作改成1,此时标记订单支付成功。那么对于后续的订单发货怎么触发?此时通过canal监听DB里的状态发送到MQ,供下游进行消费。比如订单中台监听到这个消息后开始发货。积分中台加积分等操作。
状态流转:通过canal监听DB变更触发的
变更消息解耦:变之后最好发消息而不是调用某中台,这样可以实现解耦。
兜底方案:通过定时任务进行扫描,只要是异步链路就会丢消息。
监控中间状态:订单会存在时间跨度很短的中间状态,比如从订单支付成功到订单发货的流程中,如果下游处理的速度足够快,那么订单支付成功的数据在DB里就不会存在太多。
参考
https://blog.csdn.net/mythsmyths/article/details/131340734