逻辑配置平台在商户端的实践

814 阅读5分钟


背景

随着公司业务的发展,业务数据量在迅速增加,对于数据源的准确性、可靠性、实时性提出了更高的要求。在业务数据上添加入库规则,可以很大的提高数据质量,但是入库规则一旦进行修改,就需要进行一次发布的,无法充分发挥业务系统的价值。

在此背景下,我们提供了逻辑配置平台,可以实时的对入库规则进行动态修改,实时生效,充分挖掘了高质量的数据源。同时节省了项目编译、打包、部署和重启线上机器所带来的时间和人工消耗, 提高开发效率。

业务场景

在入库规则需求中,存在如下代表性业务:

  • 根据入库规则清洗业务数据

  • 入库规则上实时触发入库异常

  • 支持入库规则动态扩展

早期方案

早期入库规则较少,我们提出了一个简单易行的方案,直接将入库规则硬编码,对于每个需求属性上添加入库规则,数据流图如下:


早期方案的弊端:

这个方案可以有效的解决数据源质量的痛点,不过随着业务数据的扩展,每次添加规则需要发布应用,维护成本比较大,同时对于数据质量管控也有一定缺陷,在数据源多样性的特性下,随时可能出现规则的变化,当前规则都是硬编码方式。业务系统无法支撑当前的需求,所以我们提出了一个新的技术方案。

技术方案 2.0

当前业务系统的瓶颈在于规则的扩展性以及实时性(硬编码方式),围绕这一问题,我们为业务系统提供一套逻辑配置平台,将硬编码方式变成动态硬编码。

逻辑配置平台本质上是将一段可执行代码,嵌入到业务代码中,系统架构图如下:


根据系统架构图中所示,逻辑配置平台系统方案主要分为三个模块:

  • 客户端模块

  • 服务端模块

  • 注册中心模块

1. 客户端模块

客户端模块主要加载规则、执行规则,订阅更新消息重新加载规则。客户端的操作主要由规则引擎支撑。引擎里涉及了实例缓存,版本缓存,JVM动态加载类,规则更新监听,定时任务规则刷新等一系列操作:

  • 实例缓存:将规则缓存在本地,优先从缓存中获取规则

  • 版本缓存:根据版本决定是否从缓存中获取规则,刷新实例

  • JVM 动态加载类:通过 GroovyClassLoader 动态加载 Java 类。

  • 规则监听:通过 ZooKeeper 为规则添加监听,订阅规则更新消息,添加到阻塞队列

  • 定时任务更新:定时任务刷新规则,加载应用下所有规则

2. 服务端模块

逻辑规则管理模块主要负责管理规则平台的逻辑规则以及提供RPC接口服务:

  • CRUD等操作:对规则进行管理

  • RPC接口:支持客户端读取逻辑规则,新建逻辑规则

3. 注册中心

这里我们使用ZooKeeper的Watcher监听来完成规则的更新规则消息的发布订阅

4. 全新架构图

架构图如下:


根据业务数据的KEY生成规则,调用逻辑配置平台RPC接口新建对应规则,由KEY查询、触发对应规则,同时将规则交给逻辑配置平台管理,业务系统通过订阅规则更新消息,动态加载规则信息。

逻辑配置平台规则一共有两种类型规则,逻辑校验规则以及逻辑处理规则。对于校验性质的需求参数,我们使用逻辑校验规则,以下是身份证逻辑校验规则样例,校验身份证是否正确:

 1 public class IdCardValidator implements IDlogicValidator {
 2    @Override
 3    public ValidateResult validate(Object param) {
 4        String idCard = param.toString();
 5        if (IdCardUtils.validate(idCard)) {
 6            return ValidateResult.buildPass();
 7        }
 8        return ValidateResult.buildFail("非法身份证号");
 9    }
10 }

然而有时候校验规则无法满足需求,这时候可以使用逻辑处理规则,以下是地址逻辑处理规则样例,地址中有中文则提取:

 1 public class AddressHandler implements IDlogicHandler {
 2    @Override
 3    public HandleResult handle(Object param) {
 4        String address = DcUtil.getChar(param.toString());
 5        if (StringUtils.isBlank(address)) {
 6            return new HandleResult("");
 7        }
 8        return new HandleResult(DcUtil.getCharEngNum(address));
 9    }
10 }


完成规则源码的开发,复制到逻辑配置平台对应规则中。逻辑配置平台支持规则管理以及实时发布规则。进入编辑页面,即可添加规则源码,保存后发布即可发布规则更新消息,客户端订阅了规则更新消息,将消息加入阻塞队列等待重新加载对应规则源码。操作页面如下:


实践总结

目前新的业务系统和逻辑配置平台已经运行一段时间,解决了以前业务系统的一些痛点,可总结优点如下:

  • 根据数据源可及时更改规则,不需要发版,实时生效。

  • 规则支持自定义扩展,方便添加规则,把控数据质量。

  • 逻辑规则模块剥离,方便规则逻辑下线,不影响流程。

  • 逻辑规则代码独立,方便调试。

未来展望

由于规则数量增多,同时规则源码添加到逻辑配置平台需要手动操作,成本比较高,未来系统着力于以下几点进行优化:

  • 规则源码自动化推送

  • 规则配置化 + 定制生成

作者简介

路遥,铜板街 Java 开发工程师,2017 年 8 月加入团队,目前主要负责商户端项目开发。


                               


                      更多精彩内容,请扫码关注 “铜板街科技” 微信公众号。