交易中台架构设计:海量并发高扩展,新业务秒级接入( 四 )


三、秒级新业务接入的交易中台
如何设计与实践
要构建一个中台 , 首先要做一个微服务架构 , 把微服务架构里的网关、公用业务逻辑、访问顺序做成中台 , 把个性化的部分做成业务逻辑层这个小前台 , 然后接入的时候把整个业务通过这种方式进行接入 。
那么 , 秒级新业务的接入我们应该怎么做呢?
交易中台架构设计:海量并发高扩展,新业务秒级接入
本文插图

图6
大家可以从上图看到 , 在很多情况下订单的整个流程是比较复杂的 , 电商订单的状态持续变化 , 每个状态的逻辑关联关系在不同的状态里变化都是不一样的 。 比如说退款这个操作 , 在发货前和发货后是完全不同的流程 , 发货前申请退款就会马上给予退款 , 但在已发货的状态下申请退款 , 就需要看商家是否同意 , 同意则退款完成 , 不同意则会驳回 。
交易中台架构设计:海量并发高扩展,新业务秒级接入
本文插图

图7
在很多情况下 , 同一个业务或者两个不同的业务 , 它们80%的业务流程都是一样的 , 只有20%不同 , 如果每一个不同的场景全都通过硬编码的方式来做 , 那整个业务的复杂度就会比较高 。 大家可以对比看看上图中C2C交易与自营交易的流程 。
交易中台架构设计:海量并发高扩展,新业务秒级接入
本文插图

图8
如果是在业务初创期 , 可以用硬编码就行 , 硬编码就是同一个状态它在满足不同流程里的继续往下不同的流转 , 你就可以if else 。 比如说if这个时间等于1干什么事情 , else if这个时间等于2干什么事情 。 这时如果你的状态不复杂的情况下 , 这个事情做起来是比较简单的 。 但如果状态比较复杂的情况下用硬编码 , 基本上你就废了 , 那这种情况下怎么做呢?
这时无非就是要做什么事情?从一个初始状态到目标状态 , 你给它一个动作以后让它进行流转 , 就是在有限状态以及在状态之间的一个转移的数据模型 , 也就是状态和动作之间的转移 。 什么是动作和转移?可以看回图6的例子 , 已支付是一个初始状态 , 申请退款是一个动作 , 然后它就进入了退款这个目标状态 。 其实所有状态之间的转移 , 都可以用图8说的FSM状态机来表达 。
交易中台架构设计:海量并发高扩展,新业务秒级接入
本文插图

图9
这个FSM解决方案的作用是 , 怎样在动作的加持下进行状态的流转 , 之后我们就可以对状态机进行抽象 。 那么状态机包含哪些要素?
交易中台架构设计:海量并发高扩展,新业务秒级接入
本文插图

图10
首先要定义状态机的框架 , 抽象业务场景状态的角色 , 包括初识状态、目标状态 , 还有角色及角色不同的操作权限 , 以及操作对应的事件、事件操作相应的Action实现(Handler) 。 需要展开说明一下的是事件的定义 , 就是角色A在初始状态S1下 , 执行OP1操作 , 将使用Handler来处理业务逻辑 , 执行成功将状态设置为目标状态S2 。 这些就是交易中台FSM普适的架构设计和实践 。
交易中台架构设计:海量并发高扩展,新业务秒级接入
本文插图

图11
如果要用一些结构化来描述应该怎么描述呢?FSM落地其实无非就是状态转移表的定义 , 状态转移表里包含操作、角色、初始状态、目标状态、Handler这几个因素 , 只要构建起这个状态转移表 , 其他就好办了 。 如果你用Java语言 , 那这套框架可以基于Spring State Machine来做 。
假设现在有了这套状态转移表 , 或者说是整个通用的FSM框架表 , 那么要接入新事件的话需要做什么事情?首先是要配置好这个表 , 然后进行新Handler业务处理的编写 , 这样就能很快进行接入 。 如果你没有新的Handler , 那整个接入就是秒级的 , 如果有新的Handler需要做的话 , 写几行代码就可以了 , 所以说这套东西对于我们来说整个处理是非常快的 。


推荐阅读