大中台模式下如何构建复杂业务核心状态机组件

简介: 大中台战略下,中台将公司业务的公共能力下沉,并采用更加合理、可复用的架构和技术来实现这些基础能力。在电商行业内,将面临货物的采购、商品上架、交易发生、订单状态变化、客服介入等大量状态维护。

大中台战略下,中台将公司业务的公共能力下沉,并采用更加合理、可复用的架构和技术来实现这些基础能力。在电商行业内,将面临货物的采购、商品上架、交易发生、订单状态变化、客服介入等大量状态维护。每个状态之间具有很强的逻辑关联关系,比如:退款操作在发货前和发货后将是完全不同的流程,如图1订单退款流程。

1.jpg

​图1 退款流程图

由此可见,对于复杂状态的管理是一个业务依赖,需求多变的场景。在公司初创期,可以采用硬编码方式,对于每一个操作进行状态判断,每一步操作定制一套逻辑链路。随着业务的增加,定制化链路显然不优雅,大量流程代码无法维护,此时中台通用解决思路就尤为重要,有限状态机(Finite State Machine,缩写:FSM)开始在中台落地。

1 有限状态机

有限状态机(以下简称FSM)又称有限状态自动机,简称状态机。维基百科定义是表示有限个状态以及在这些状态之间的转移和动作等行为的数学模型。

这个模型和业务中台遇到的问题十分吻合。图1是状态转移图,可以用来表示状态机,此外可以使用状态转移表来表示。如图2所示:

2.jpg
图2 状态转移表

可以看出,FSM是通过抽象为动作和状态,管理有限个状态转移的模型。动作是在给定时刻要进行的活动的描述,我们总结动作类型有如下:

进入动作:在进入状态时进行

退出动作:在退出状态时进行

输入动作:依赖于当前状态和输入条件进行

转移动作:在进行特定转移时进行

在FSM框架下,将流水线的状态流转流程进行了抽象和结构化,将复杂的状态转移图,分割成相邻状态的最小单元。这样相当于搭建了乐高积木,在这套机制上可以组合成复杂的状态转移图。

2 Spring StateMachine

Spring Statemachine框架主要是帮助开发者简化状态机的开发过程,让状态机结构更加层次化,我们来看下Spring SM怎么实现。首先最小的乐高模型如图3所示 :

3.jpg

图3 SM最小单元

假如有状态 STATE1, STATE2和事件EVENT1, EVENT2。事件驱动状态流转。下面来分析下Spring SM的主要代码。

2.1 依赖pom

 <dependency> 

        <groupId>org.springframework.statemachine</groupId> 

        <artifactId>spring-statemachine-core</artifactId> 

        <version>2.1.3.RELEASE</version> 

</dependency> 

2.2 创建状态机

通过注解来注册状态机的三要素:source、target、event

4.jpg

2.3 注解监听器

通过监听器感知事件发生,并相应的处理相关逻辑

5.jpg
2.4 运行状态机
6.jpg

3 交易中台

在交易场景,定义了自己的状态机框架,抽象了符合交易场景的状态角色:

初始状态、目标状态:状态关系

角色:不同角色有不同的操作权限,比如卖家、买家、系统、客服

操作:对应事件

handler:事件操作相应的action实现

因此一个事件我们可以定义为:在角色A,在初始状态S1下,执行OP1操作,将使用handler来处理,执行成功将状态设置为目标状态S2。

3.1 个性化FSM抽象

鉴于交易的个性化需要,扩展了状态表的条件,同时使用handler和Java反射,来对逻辑代码进一步结构化。到这一步后,我们可以将数据模板存储到数据库中。如图4:

7.jpg
图4 交易中台FSM状态表

通过改造,核心代码FSM执行引擎只有不到100行。通过注册业务handler,可以灵活的扩充业务能力。同时数据状态的维护是通过状态表,而不依赖手动编写代码,这对于代码质量的保证、工程回归测试都节省了大量的时间。也为中台实现配置化做好了铺垫。

3.2 中台赋能业务

中台沉淀了基础能力,如何实现?中台如何赋能业务的,业务是否满意呢?

看下面一个例子,基于交易,C2C、自营是两个具有极大区别的业务,他们有完全不同的两套业务流程。C2C平台需要对买卖两端进行担保,而自营更多的是给予买家保证权益。简化版流程如图5:

8.jpg

图5 简化版交易流程

通过中台FSM能力,我们只要能将状态图绘制出来,那么相应的状态流转表配置也已经产生。handler 只需要关注当前操作的业务逻辑,极大的解耦了状态和业务。

可以毫不夸张的说,一个新业务过来,中台能在2天时间内单人完成状态机配置开发上线。这就是中台的效率。

4 总结

FSM解决复杂业务状态流转的问题,并以交易业务进行举例。但是FSM的应用场景远多于交易。比如客服工单,商品状态等。但不是所有的流程都需要使用FSM,需要做好业务流程的折中,就像中台战略更适用于10-100 阶段的公司一样。

同时FSM只是一个框架,还需要搭建一整套基于它的外围业务逻辑。在状态流转过程中,业务逻辑才是我们的肌肉。框架就像骨骼约束着我们,从而让技术成长更加健康,这也许就是中台的魅力。

相关文章
|
JSON 自然语言处理 安全
百度工程师厂外生存指南
百度曾经一度被称为中国互联网的黄埔军校。这句话其实有两方面含义:一是说从百度走出来的工程师活跃在中国各大互联网企业中,对整个中国互联网的繁荣发展做出了贡献。二是说百度如同历史上的黄埔军校一般,为外界培育和输送了大量人才,但是自身却在逐步没落,暗示百度的人才流失严重。然而很多百度厂内高管常以『百度是中国互联网的黄埔军校』而自豪,这只是理解了这句话的第一层含义,却殊不知其第二层。高管们不对厂内人才大量流失的原因做反思,反而因为一句黄埔军校而沾沾自喜。着实让人唏嘘不已。
1841 1
百度工程师厂外生存指南
|
11月前
|
前端开发 JavaScript 关系型数据库
如何开发生产小工单中的产品管理板块(附架构图+流程图+代码参考)
生产小工单中的产品管理板块是制造业数字化管理的关键环节,涵盖产品信息、生产工序、产品列表和基础设置四大功能模块。通过系统化管理,企业可实现对产品属性、工艺流程及资源配置的精准控制,提升生产效率并减少误差与浪费。本文详解了各功能模块的设计逻辑、业务流程及开发实现方案,并提供示例代码,助力企业构建高效、灵活的产品管理系统。
|
7月前
|
Web App开发 安全 搜索推荐
谷歌Chrome“纯净无广”的手机浏览器!,浏览器中的天花版
谷歌Chrome安卓版,纯净无广告,启动快、无弹窗,支持无痕浏览,权限透明,全球超10亿下载,流畅安全,堪称手机浏览器天花板,推荐体验!
725 1
|
7月前
|
消息中间件 弹性计算 关系型数据库
阿里云服务器2核8G、4核16G、8核32G配置ECS实例规格族和选型指南
阿里云2核8G、4核16G、8核32G配置推荐选用r系列(内存型)或g系列(通用型)企业级独享实例,vCPU与内存比为1:4。r系列适合Redis、内存数据库等高内存需求场景;g系列适用于Java Web、MySQL等均衡型应用。同规格族内,核数越高,网络PPS、IOPS性能越强。新购建议选新一代r8i/g8i,性能提升显著;成本敏感可选r7/g7。避免用2核8G部署重负载数据库,高并发Kafka场景优选c系列。具体配置与活动价格详见阿里云官网。
729 1
|
9月前
|
算法 安全 数据挖掘
【EI复现】梯级水光互补系统最大化可消纳电量期望短期优化调度模型(Matlab代码实现)
【EI复现】梯级水光互补系统最大化可消纳电量期望短期优化调度模型(Matlab代码实现)
208 0
|
机器学习/深度学习 人工智能 算法
【服装识别系统】图像识别+Python+人工智能+深度学习+算法模型+TensorFlow
服装识别系统,本系统作为图像识别方面的一个典型应用,使用Python作为主要编程语言,并通过TensorFlow搭建ResNet50卷积神经算法网络模型,通过对18种不同的服装('黑色连衣裙', '黑色衬衫', '黑色鞋子', '黑色短裤', '蓝色连衣裙', '蓝色衬衫', '蓝色鞋子', '蓝色短裤', '棕色鞋子', '棕色短裤', '绿色衬衫', '绿色鞋子', '绿色短裤', '红色连衣裙', '红色鞋子', '白色连衣裙', '白色鞋子', '白色短裤')数据集进行训练,最后得到一个识别精度较高的H5格式模型文件,然后基于Django搭建Web网页端可视化操作界面,实现用户在界面中
957 1
【服装识别系统】图像识别+Python+人工智能+深度学习+算法模型+TensorFlow
|
存储 安全 API
VFIO【ChatGPT】
VFIO【ChatGPT】
|
存储 开发框架 自然语言处理
【Uniapp 专栏】Uniapp 的多语言支持功能详解
【5月更文挑战第14天】Uniapp是一款跨平台开发框架,提供强大多语言支持,助力开发者轻松构建支持多种语言的应用,提升用户体验和市场拓展。其特点包括灵活的语言管理、跨平台一致性。通过语言文件存储内容,切换机制让用户自由切换。注重翻译准确性和文化适应性,集成到页面和组件中,同时关注性能优化。面对翻译不一致和更新及时性等问题,Uniapp将持续发展和完善,为全球化应用开发提供强有力支持。
1019 3
【Uniapp 专栏】Uniapp 的多语言支持功能详解
|
安全 Java
使用Calendar.add进行日期计算的方法与实例
使用Calendar.add进行日期计算的方法与实例
|
Java
Java垃圾回收器:版本差异、使用技巧与最佳实践
Java垃圾回收器:版本差异、使用技巧与最佳实践
677 1