支付路由系统设计二:命中-1

支付路由系统设计二:命中-1,第1张

支付路由系统设计二:命中-1

技术栈:Java+Groovy+Lua+Springboot+Mysql+Redis+Drools+Velocity+RabbitMQ+Spring Data Jpa

一、背景

此篇文章我们来片命中部分设计,在上一篇中我们确定了命中维度是交易类型,首先支付系统上送的报文中肯定有交易类型字段,或者通过某种方式可以将某字段转换出交易类型,总之我们肯定知道了此交易是何种交易类型,是代扣、是代付还是快捷等等...

二、分析设计 1.分析

在router_rule_table中存储着我们的规则,也就是以交易类型为维度的规则。

我们以代扣交易为例:讲我们的设计演进,首先交易系统上送到路由系统的主要基本参数有:交易类型(deduct)、交易金额(100.00)、开户行(0801)、卡类型(E)等,假如此时我们规则表中有如上三条规则(1.2.3),那么我们可以根据上送的报文参数-交易类型为条件

sql:select * from router_rule_table where trans_code=deduct;

那么就命中出来了规则表中第一条规则,达到了我们想要的目的了,本部分不就是要以交易类型为维度命中我们的规则吗?看似没有任何问题,但是我只想说,这种设计后期绝对能把人恶心吐了。我们接着分析,如果我们又接了一个通道A,并且也接入其代扣交易类型(规则4),然鹅此通道并非提供给原来业务线使用,假如原来业务线是话费代扣业务线,现在提供给水电煤代缴,那么你上一个sql这么写还对吗?不对了吧,这时候怎么办,为了区分不同产品线,这时候你又机智的在表中加了个字段-product_code,又将历史数据的product_code进行编制填充,经过一波猛如虎的 *** 作,暂时满足了需求,

sql改为:select * from router_rule_table where trans_code=deduct and product_code=001;

没过了多久,又来需求,区分移动端和pc端,规则表又要加字段场景码scene,又重复上一波 *** 作,扩表加字段改sql,

最终sql改为:select * from router_rule_table where trans_code=deduct and product_code=001 and scene=002;

只要规则增加条件就来一波如上 *** 作,这样的系统谁后期负责谁恶心,这种设计不仅是存在后期扩展上的问题,也仅仅是简单的=判断逻辑,可以说毫无扩展可言吧。 

2.设计

那么我们该如何解决如上问题呢?
首先我们要确定几个问题,第一根据交易类型维度进行规则命中是没有问题的,第二命中的条件不应该横向扩展在规则表中,如果横向扩展那么在增加命中条件时你就躲不开对表进行扩展,既然不能横向扩展,那么就纵向扩展,怎么个纵向法,如下图:


增加rule_condition表,独立表挂靠命中条件,同时设定where条件不仅仅是简单的=了,更强大的条件判断规则,如=、!=、in、!in、>、<、>=、<=等,如果基本运算满足不了还可以切入Groovy脚本进行数据计算处理,那么我们的规则存储方式变为如下:

当使用纵向扩展方式,同时使用Drools规则引擎和Velocity模板引擎结合使用来组织这些规则条件,难度等级上了不止一个层次了,但是这样的系统,运营使用起来会非常爽,简单的配置就可以满足业务需求了,运营 *** 作页面如图,请忽略原型图的丑陋:




图一表单对应规则表router_rule_table,图二表单对应条件表rule_condition,当上送报文满足配置条件规则符以及脚本计算值即可命中此规则,当此种设计模式下,我们再来看上面的场景变更,无非就是在规则条件中新增加一条条件,product=XXX,不用需要进行表结构调整,也不需要调整代码,运营调整配置即可满足需求了。

对比模式一设计和采用模式二设计,你知道差距在哪里了吧。

三、总结

具体怎么使用Drools规则引擎和Velocity模板引擎和Groovy满足如上设计,下次分享吧,图书馆不论是湿度还是温度,都适合睡觉呀。

欢迎分享,转载请注明来源:内存溢出

原文地址: http://outofmemory.cn/zaji/5562713.html

(0)
打赏 微信扫一扫 微信扫一扫 支付宝扫一扫 支付宝扫一扫
上一篇 2022-12-14
下一篇 2022-12-14

发表评论

登录后才能评论

评论列表(0条)

保存