前往小程序,Get更优阅读体验!
立即前往
首页
学习
活动
专区
工具
TVP
发布
社区首页 >专栏 >状态机的设计与实现

状态机的设计与实现

作者头像
CBeann
发布2023-12-25 19:53:14
2260
发布2023-12-25 19:53:14
举报
文章被收录于专栏:CBeann的博客CBeann的博客

写作目的

好久没有写博客进行输出了,是时候需要水一篇了,嘻嘻。 正好项目中使用了状态机,也借此分享一下系统中状态机的项目落地经验。

什么是状态机

以在某宝下单为例,在点击下单后,此时订单就已经创建了,处于待支付状态,支付成功后变为带发布,收货成功后变为完成。其实一个订单的的状态是可穷举状态流转是固定的,比如待收货的订单只能从支付成功来。

在这里插入图片描述
在这里插入图片描述

解决方案

我们还是以订单状态流转为例进行分析,当然SpringBoot提供了状态机解决方案。但是还有另一种的状态机解决方案:基于binlog实现状态机

在这里插入图片描述
在这里插入图片描述

如上图所示,任何动作仅仅是关注一个动作。以支付为例,当用户支付成功后,核心动作仅仅是把DB里订单的动作改成1,此时标记订单支付成功。那么对于后续的订单发货怎么触发?此时通过canal监听DB里的状态发送到MQ,供下游进行消费。比如订单中台监听到这个消息后开始发货。积分中台加积分等操作。

状态流转:通过canal监听DB变更触发的 变更消息解耦:变之后最好发消息而不是调用某中台,这样可以实现解耦。 兜底方案:通过定时任务进行扫描,只要是异步链路就会丢消息。 监控中间状态:订单会存在时间跨度很短的中间状态,比如从订单支付成功到订单发货的流程中,如果下游处理的速度足够快,那么订单支付成功的数据在DB里就不会存在太多。

参考

https://blog.csdn.net/mythsmyths/article/details/131340734

本文参与 腾讯云自媒体分享计划,分享自作者个人站点/博客。
原始发表:2023-10-29,如有侵权请联系 cloudcommunity@tencent.com 删除

本文分享自 作者个人站点/博客 前往查看

如有侵权,请联系 cloudcommunity@tencent.com 删除。

本文参与 腾讯云自媒体分享计划  ,欢迎热爱写作的你一起参与!

评论
登录后参与评论
0 条评论
热度
最新
推荐阅读
目录
  • 写作目的
  • 什么是状态机
  • 解决方案
  • 参考
领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档