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

文章插图
- 服务层:服务层主要是对外提供服务的入口层 , 提供的服务包括数据分析、风险检测、业务决策等 , 所有的服务全部都是通过数据接入模块接入数据 , 具体后面讲
- 引擎层:引擎层是整个平台的核心 , 主要包括了执行规则的规则引擎、还原事件现场和聚合查询分析的查询引擎以及模型预测的模型引擎
- 计算层:计算层主要包括了指标计算模块和模型训练模块 。指标会在规则引擎中配置规则时使用到 , 而模型训练则是为模型预测做准备
- 存储层:存储层包括了指标计算结果的存储、事件信息详情的存储以及模型样本、模型文件的存储

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

文章插图
2.指标计算模块
指标计算模块主要是进行指标计算 。一个指标由主维度、从维度、时间窗口等组成 , 其中主维度至少有一个 , 从维度最多有一个 。如下图:

文章插图
举个例子 , 若有这样一个指标:“最近10分钟 , 同一个账号在同一个商家的下单金额” , 那么主维度就是下单账号+商家id , 从维度就是订单金额 。可以看到 , 这里的主维度相当于sql里面的group by , 从维度相当于count , 数值累加相当于sum 。从关于指标计算 , 有几点说明下:
- key的构成 。我们的指标存储是用的redis , 那么这里会涉及到一个key该如何构建的问题 。我们目前的做法是:key=指标id+版本号+主维度值+时间间隔序号 。
-
- 指标id就是指标的唯一标示;
- 版本号是指标对象的版本 , 每次更新完指标都会更新对应的版本号 , 这样可以让就的指标一次全部失效;
- 主维度值是指当前事件对象中 , 主维度字段对应的值 , 比如一个下单事件 , 主维度是用户账号 , 那么这里就是对应的类似XXX@163.com , 如果有多个主维度则需要全部组装上去;
- 如果主维度的值出现中文 , 这样直接拼接在key里面会有问题 , 可以采用转义或者md5的方式进行 。
- 时间间隔序号是指当前时间减去指标最后更新时间 , 得到的差值再除以采样周期 , 得到一个序号 。这么做主要是为了实现指标的滑动窗口计算 , 下面会讲
- 滑动窗口计算 。比如我们的指标是最近10分钟的同一用户的下单量 , 那么我们就需要实现一种类似的滑动窗口算法 , 以便任何时候都能拿到“最近10分钟”的数据 。这里我们采用的是一种简单的算法:创建指标时 , 指定好采样次数 。比如要获取“最近10分钟”的数据 , 采样次数设置成30次 , 这样我们会把每隔20秒的数据会放入一个key里面 。每次一个下单事件过来时 , 计算出时间间隔序号(见第1点) , 然后组装好key之后看该key是否存在 , 存在则进行累计 , 否则往redis中添加该key 。
推荐阅读
- 时间线桌游具体规则
- 只言片语桌游游戏玩法及规则
- shopee运营规则?shopee平台规则怎么样
- 考拉功能性灭绝什么意思 考拉为什么没有灭绝
- amd处理器编号含义-amd cpu型号命名规则-
- 大富翁纸牌游戏规则说明
- 大学生|工作能力强为何不能成为领导?升职后才发现,不是因为“潜规则”
- 羽毛球单打比赛规则
- 古玩市场交易需要遵守的规则
- 春秋时期打仗规则 春秋时期的战争礼仪
