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


上面的这种架构设计方式 , 其实就是一种典型的“领域驱动设计(DDD)”思想 , 在这里就不展开说明了(主要是自己理解的还不够深入 , 怕误导大家了) 。DDD也是目前非常热门的一种架构设计思想了 , 它不能减少你的代码量 , 但是能使你的代码具有很高的内聚性 , 当你的项目变得越来越复杂时 , 能保持架构的稳定而不至于过快的腐烂掉 , 不了解的同学可以查看相关资料 。要说明的是 , 没有一种架构设计是万能的、是能解决所有问题的 , 我们需要做的是吸收好的架构设计思维方式 , 真正架构落地时还是需要根据实际情况选择合适的架构 。
整体架构设计
上面说了些架构设计方面的想法 , 现在我们回到规则引擎平台本身 。我们抽象出了四个分层 , 从上到下分别为:服务层、引擎层、计算层和存储层 , 整个逻辑层架构见下图:

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

文章插图
 
  • 服务层:服务层主要是对外提供服务的入口层 , 提供的服务包括数据分析、风险检测、业务决策等 , 所有的服务全部都是通过数据接入模块接入数据 , 具体后面讲
  • 引擎层:引擎层是整个平台的核心 , 主要包括了执行规则的规则引擎、还原事件现场和聚合查询分析的查询引擎以及模型预测的模型引擎
  • 计算层:计算层主要包括了指标计算模块和模型训练模块 。指标会在规则引擎中配置规则时使用到 , 而模型训练则是为模型预测做准备
  • 存储层:存储层包括了指标计算结果的存储、事件信息详情的存储以及模型样本、模型文件的存储
在各个分层的逻辑架构划定后 , 我们就可以开始分析整个平台的业务功能模块 。主要包括了事件接入模块、指标计算模块、规则引擎模块、运营中心模块 , 整个业务架构如下图:
网易考拉规则引擎平台架构设计与实践

文章插图
 
1.事件接入中心
事件接入中心主要包括事件接入模块和数据管理模块 。数据接入模块是整个规则引擎的数据流入口 , 所有的业务方都是通过这个模块接入到平台中来 。提供了实时(dubbo)、准实时(kafka)和离线(hive)三种数据接入方式 。数据管理模块主要是进行事件的元数据管理、标准化接入数据、补全必要的字段 , 如下图:
网易考拉规则引擎平台架构设计与实践

文章插图
 
2.指标计算模块
指标计算模块主要是进行指标计算 。一个指标由主维度、从维度、时间窗口等组成 , 其中主维度至少有一个 , 从维度最多有一个 。如下图:
网易考拉规则引擎平台架构设计与实践

文章插图
 
举个例子 , 若有这样一个指标:“最近10分钟 , 同一个账号在同一个商家的下单金额” , 那么主维度就是下单账号+商家id , 从维度就是订单金额 。可以看到 , 这里的主维度相当于sql里面的group by , 从维度相当于count , 数值累加相当于sum 。从关于指标计算 , 有几点说明下:
  1. key的构成 。我们的指标存储是用的redis , 那么这里会涉及到一个key该如何构建的问题 。我们目前的做法是:key=指标id+版本号+主维度值+时间间隔序号 。
    • 指标id就是指标的唯一标示;
    • 版本号是指标对象的版本 , 每次更新完指标都会更新对应的版本号 , 这样可以让就的指标一次全部失效;
    • 主维度值是指当前事件对象中 , 主维度字段对应的值 , 比如一个下单事件 , 主维度是用户账号 , 那么这里就是对应的类似XXX@163.com , 如果有多个主维度则需要全部组装上去;
    • 如果主维度的值出现中文 , 这样直接拼接在key里面会有问题 , 可以采用转义或者md5的方式进行 。
    • 时间间隔序号是指当前时间减去指标最后更新时间 , 得到的差值再除以采样周期 , 得到一个序号 。这么做主要是为了实现指标的滑动窗口计算 , 下面会讲
  1. 滑动窗口计算 。比如我们的指标是最近10分钟的同一用户的下单量 , 那么我们就需要实现一种类似的滑动窗口算法 , 以便任何时候都能拿到“最近10分钟”的数据 。这里我们采用的是一种简单的算法:创建指标时 , 指定好采样次数 。比如要获取“最近10分钟”的数据 , 采样次数设置成30次 , 这样我们会把每隔20秒的数据会放入一个key里面 。每次一个下单事件过来时 , 计算出时间间隔序号(见第1点) , 然后组装好key之后看该key是否存在 , 存在则进行累计 , 否则往redis中添加该key 。


    推荐阅读