网易考拉规则引擎平台架构设计与实践( 三 )

  • 如何批量获取key 。每次获取指标值时 , 我们都是先计算出需要的key集合(比如我要获取“单个账号最近10分钟的下单量” , 我可能需要获取30个key , 因为每个key的跨度是20s) , 然后获取到对应的value集合 , 再进行累加 。而实际上我们只是需要累加后的值 , 这里可以通过redis+lua脚本进行优化 , 脚本里面直接根据key集合获取value后进行累加然后返回给客户端 , 这样就较少了每次响应的数据量 。
  • 如何保证指标的计算结果不丢失?目前的指标是存储在redis里面的 , 后来会切到solo-ldb , ldb提供了持久化的存储引擎 , 可以保证数据不丢失 。
  • 3.规则引擎模块
    计划开始做规则引擎时进行过调研 , 发现很多类似的平台都会使用drools 。而我们从一开始就放弃了drools而全部使用groovy脚本实现 , 主要是有以下几点考虑:
    • drools相对来说有点重 , 而且它的规则语言不管对于开发还是运营来说都有学习成本
    • drools使用起来没有groovy脚本灵活 。groovy可以和spring完美结合 , 并且可以自定义各种组件实现插件化开发 。
    • 当规则集变得复杂起来时 , 使用drools管理起来有点力不从心 。
    当然还有另外一种方式是将drools和groovy结合起来 , 综合双方的优点 , 也是一种不错的选择 , 大家可以尝试一下 。
    规则引擎模块是整个平台的核心 , 我们将整个模块分成了以下几个部分:
    网易考拉规则引擎平台架构设计与实践

    文章插图
     
    规则引擎在设计中也碰到了一些问题 , 这里给大家分享下一些心得:
    • 使用插件的方式加载各种组件到上下文中 , 极大的方便了功能开发的灵活性 。
    • 使用预加载的方式加载已有的规则 , 并将加载后的对象缓存起来 , 每次规则变更时重新load整条规则 , 极大的提升了引擎的执行效率
    • 计数器引入AtomicLongFieldUpdater工具类 , 来减少计数器的内存消耗
    • 灵活的上下文使用方式 , 方便定制规则执行的流程(规则执行顺序、同步异步执行、跳过某些规则、规则集短路等) , 灵活定义返回结果(可以返回整个上下文 , 可以返回每条规则的结果 , 也可以返回最后一条规则的结果) , 这些都可以通过设置上下文来实现 。
    • groovy的方法查找策略 , 默认是从metaClass里面查找 , 再从上下文里找 , 为了提升性能 , 我们重写了metaClass , 修改了这个查询逻辑:先从上下文里找 , 再从metaClass里面找 。
    规则配置如下图所示:
    网易考拉规则引擎平台架构设计与实践

    文章插图
     
    未来规划
    后面规则引擎平台主要会围绕下面几点来做:
    1. 指标存储计划从redis切换到hbase 。目前的指标计算方式会导致缓存key的暴涨 , 获取一个指标值可能需要N个key来做累加 , 而换成hbase之后 , 一个指标就只需要一条记录来维护 , 使用hbase的列族来实现滑动窗口的计算 。
    2. 规则的灰度上线 。当一条新规则创建后 , 如果不进行灰度的测试 , 直接上线是可能会带来灾难的 。后面再规则上线流程中新增灰度上线环节 , 整个引擎会根据配置的灰度比例 , 复制一定的流量到灰度规则中 , 并对灰度规则的效果进行展示 , 达到预期效果并稳定后才能审批上线 。
    3. 事件接入的自动化 。dubbo这块可以采用泛化调用 , http接口需要统一调用标准 , 消息需要统一格式 。有了统一的标准就可以实现事件自动接入而不需要修改代码上线 , 这样也可以保证整个引擎的稳定性 。
    4. 模型生命周期管理 。目前模型这块都是通过在猛犸平台上提交jar包的方式 , 离线跑一个model出来 , 没有一个统一的平台去管控整个模型的生命周期 。现在杭研已经有类似的平台了 , 后续需要考虑如何介入 。
    5. 数据展示优化 。现在整个平台的数字化做的比较弱 , 没法形成数据驱动业务 。而风控的运营往往是需要大量的数据去驱动规则的优化的 , 比如规则阈值的调试、规则命中率、风险大盘等都需要大量数据的支撑 。


      推荐阅读