如何设计交易中台服务
通过电商平台进行购物通常会经过下单、支付、发货、收货等多个流程,我们往往使用【链路】的方式来表达该流程,如下图所示。在画交易链路图时需要注意:圆圈表示的是一个【状态】,圆圈之间的连线表示的是一个【事件】或【动作】;【状态】是在【事件】的驱动之下进行更新和变化的;【状态】具有持续性,而【事件】则是瞬时的。
像这样的一个交易链路是非常非常理想化的。现实中,随着用户量增大,交易中各种异常情况的出现,我们需要在该交易链路中引入各种 "负向的行为"。所以,真实的交易链路应该是如下图所示的情况这样: 交易链路应该是网状结构,而非线性结构!
面对这样的一个交易链路,应该如何进行实现呢?相比应该难不倒大家,哪怕多写几个 if-else 和 switch 语句也是可以落地实现的。
我们今天的问题是:假设你是一个交易中台的技术负责人,有几十条业务线会接入交易中台系统;最关键的点是这几十条业务线都有自己专门的交易链路(比如:有的业务线是做 C2C交易的,有的业务线是做 B2B 交易的,还有的业务线是做 C2B2C 交易的),这几十条交易链路都有自己的流转规则,如下图所示。
你作为交易中台的技术负责人,针对交易链路这一块,应该如何设计交易中台呢?既要方便业务线快速接入,也要方便后续交易中台的代码维护。
=============================================
解析:
交易链路图其本质是一个状态转换图,状态转换图表达的是一个【有限状态机】,即我们常说的【FSM】。我们基于 FSM 的思想来设计交易中台,整体架构如下图。
每条业务线都有自己的状态流转规则,而且状态流转规则会随着业务发展不断进行更新;要更轻松维护这几十个 FSM ,需要统一对其进行结构化存储,降低状态变更和代码维护的复杂度,并由【交易中台】作为 "FSM 执行机" 来执行交易流程。
为实现业务线快速接入,可通过 "配置化" 的方式实现接入;FSM 实现结构化存储之后,实现业务线配置化接入则是顺理成章的事情了! 下面我们集中讨论如何实现 FSM 的结构化存储。
我们对交易链路进行抽象,可以剥离出一个最小的链路单元: 【一个当前状态】和【一个动作】和【一个更新后的状态】;那么所有的链路单元组合在一起,就是复杂的网状结构的交易链路了 ;我们用以下图来表示每一个交易链路单元。
在这个二维表格中,纵向第一列的每一个单元格表示【交易状态】,横向第二行的每一个单元格表示【动作】,中间单元格表示每一个对应的动作触发状态的变化。
我们将每一个最小的链路单元作为一条记录,可以很容易实现 FSM 的结构化表示,如下图二维关系表所示:
我们对每一个字段逐个进行分析:
1.【id】id 是一个自增型的主键,唯一表示一条记录;每一条数据记录就是一个最小的交易链路单元;
2.【fsm_type】fsm_type 用以区分不同的业务线,每一条业务线都有其自己独立的 FSM 编号;
3.【op_type】op_type 表示 动作或事件,该动作触发了交易状态的变化;
4.【role】role 用于描述触发动作的角色,例如:"同意退款" 这个动作只能由 "卖家" 这个角色来完成,"买家" 是没有权限触发的; 因此 role 这个字段可以更方便实现用户的权限控制;
5.【source_status】和 【target_status】source_status 是变更之前的 "交易状态",target_status 是变更之后的 "交易状态";综述以上几个字段,就是: role 角色的用户触发了 op_type 动作,将交易状态 source_status 变更为 target_status;
6.【handler】handler 这是整个交易中台设计的亮点,体现了插件化和可插拔的设计思想;在交易状态变更时需要执行的业务逻辑由 handler 进行执行,配置了什么样的 handler,就执行怎样的逻辑;很明显,在具体落地时,通常由【反射机制】实现字符串到实现类的映射。
对这 7 个字段完全理解之后,对交易链路中台的设计在一瞬间应该会有豁然开朗的感觉。任何一条业务线,在接入交易中台时,只需在该二维表格填写记录,表达出交易链路规则即可。
接下来就是交易中台的 FSM 执行机如何基于 FSM 的结构化存储来完成交易链路逻辑了;彻底理解整个交易中台的设计思想后,这一部分逻辑就非常简单了;这里将接口设计列出,具体实现大家自行实现,具体细节我们在后面的技术短文中继续进行分析。
//FSM 执行机引擎接口
public interface FsmEngine {
//初始化状态机配置
void init();
//执行状态机
void perform(FsmContext context);
//获取执行机运行后的状态
FsmNodeResult getPerformResult(FsmContext context);
}
//状态机在状态变化时执行的 handler 接口
public interface FsmAction {
//操作权限校验
void check(FsmContext context);
//执行状态机 handler
void execute(FsmContext context, FsmNodeResult fsmNodeResult);
}
最后,总结文中关键:
1.交易链路图其本质是一个状态转换图,表达的是一个FSM , 即有限状态机;
2.对 FSM 进行结构化存储,降低交易状态变更和代码维护的复杂度,方便业务线配置化接入;
3.将每一个最小的链路单元作为一条记录,可以很容易实现 FSM 的结构化表示;
4.对 FSM 进行结构化存储时,涉及关键字段:【id】【fsm_type】【op_type】【role】【source_status】【target_status】【handler】,handler 是整个交易中台设计的亮点,体现了插件化和可插拔的设计思想。
安史之乱有多恐怖?长安城十室九空,睢阳城三万百姓被煮熟吃掉公元755年12月的一天,骊山华清宫里,莺歌燕舞,一派祥和欢乐的气氛。70岁的唐玄宗李隆基,正在和36岁的杨贵妃,觥筹交错,谈笑风生,享受太平盛世下的美好生活。突然,丞相杨国忠一路
显微镜下的大明之六正统年间的四条冤魂很简短的一个故事,就是有人诬告,四个无罪之人被屈打成招,但大明律法看人头需要逐级上报,由州府移交中枢,由刑部都察院大理寺三轮复审,三个部门一致同意了,再请皇帝勾决
惧鲸的龙子蒲牢蒲牢在古代中国神话传说中为龙九子之一,排行第四,平生好音好吼,洪钟上的龙形兽钮是它的遗像。文选汉班孟坚(固)东都赋于是发鲸鱼,铿华钟。注(三国)薛淙西京赋注曰海中有大鱼曰鲸,海边又
岁月神偷日子太不经混了,就这么稀里糊涂不知不觉竟混过了整整五十年,知天命,还真不知道。在早己脱单却未脱贫的路上奔波,医保也解决不了的脱发如影相随。如果哄小孩给颗糖,其实成年人更需要,至少要
新疆特有地方剧种曲子戏何以传唱百余年?中新网乌鲁木齐11月29日电题新疆特有地方剧种曲子戏何以传唱百余年?作者戚亚平齐琳洁每天上午哼着小曲忙完家务,家住新疆生产建设兵团第六师红旗农场的刘淑珍都会简单打扮一番,然后便和同
南阳一个值得三顾的地方老子隐居第四洞天纪念票正式发行欢迎关注南阳文化旅游网(一部手机游南阳),将发布您最感兴趣的最新政策,文旅资讯,民生服务景区策划活动组织团队出游文旅特产旅游线路等信息,是吃住行游购娱企业和单位投放广告出游优选的合
离天堂最近的地方,西藏阿里阿里被称为西藏的屋脊,平均海拔4500,地广人稀,周围遍布雪山圣湖,无数的藏羚羊藏野驴在这里无忧无虑的自由奔跑。这里有被藏传佛教徒视为世界中心的神山岗仁波钦与神女峰纳木那尼遥遥相望
200不到就能住索菲特,这里应该是全国住酒店最便宜的地方原本以为澳门的消费水平很高住什么地方都是很贵的,因为他们只有五星级酒店可以选择。没想到在疫情之后,这里的酒店全部变成白菜价。就算现在推出了电子签证,澳门的入住率依旧不是特别高。因为
100句在段首文末的14字硬核金句愿有前程可奔赴亦有岁月可回首71莫道浮云终蔽日,严冬过尽绽春蕾。适用主题拨云睹日心怀希望释义意指不要认为天空中乌云会一直遮住太阳,严寒的冬季过后春天的花就会开放。不要因眼前的逆境或挫折而气馁,希望和光明总会出
明朝末年的车厢峡之战,告诉你战场上的天真会要了自己的命李自成和张献忠,他们俩人到底谁才是大明王朝的掘墓人?对于此问,众说纷纭。有说李自成,有说张献忠。说李自成,是因为他亲自带兵攻破了明朝的都城北京。说张献忠,是因为他纵横的地域远超李自
曝光iPhone15系列有五款机型,iPhone14跌至大米价快快欢呼疯抢据悉目前已经的iPhone15共有iPhone15标准版iPhone15PlusiPhone15ProiPhone15ProMaxiPhone15UItra五款机型,全系都采用了灵