动手撸一个规则引擎(二):方案解析

  • 2019 年 10 月 4 日
  • 筆記

写在前面

规则引擎可以搞啥?一般使用场景,是通过可视化节目进行拖拉或者简单的操作指定流程和规则,将规则输入得到目标输出。

交易系统中的规则引擎

规则编排的过程是各种条件的组合,类似于搭积木,指定逻辑规则,细化逻辑因子,比如指定选人规则,一个用户id进来之后根据指定的不同逻辑规则得到该用户可以发的券集合。同样可以用来筛选商品,筛选营销规则等。

在交易系统中主要是和用户和营销策略相关,比如根据历史订单,是否会员信息,是否门店新老客等规则因子,组合规则因子,也就是指定决策逻辑。动态的去响应不同用户的不同策略。

规则引擎的难点

规则引擎的难点在于:规则的易变和定制化。

规则往往处于热更新的状态,在产品决策过程中因为ABTest等原因,可能随时调整规则。同时一套营销规则可能因为用户画像不同导致千人前面的策略,有一定的定制特点。

在没有规则引擎之前,系统实现规则引擎一般采用硬编码,if/else等方式。哪怕是将规则相关逻辑单独抽离到规则模块,代码规则实现存在硬编码难以热更新的问题依然存在。

但是硬编码并非一无是处,较粗粒度的规则还是需要固化到系统中,这样可以达到更好封装和抽象的目的,降低一定的迭代成本。

规则引擎系统

规则引擎被定义为系统中的一组规则组件,可以将业务逻辑和决策逻辑进行拆分,抽离出来。

规则引擎的关键词:

  • 实事:用户的输入信息为实事
  • 规则:定制化的业务规则逻辑
  • 结果:规则加工和执行之后产生的结果

为更好的固化和沉淀一部分规则到系统中,我们一般建立一套规则管理系统,以可视化方式提供给使用方,在可视化界面操作规则编排,规则的变更最好加上版本,以区分和热更新,避免硬切规则造成的数据不一致情况,可以平滑过度到下一个规则中。

规则引擎的难点在于,对于配置化的规则进行系统性的解析和业务逻辑的执行,当我们通过存储系统对规则进行存储之后,在将规则以原子性的方式拉取出来后,执行规则便成了比较复杂的地方了,一般可以采用Drools,Aviator等三方引擎,也可以自己定制。

  • Drools:适用于风控金融,用起来比较复杂
  • Grovvy,JPython:可以嵌入到系统中进行逻辑执行,但是性能存在考量空间