腾讯内容千亿级实时计算和规则引擎实践优化之路( 六 )

腾讯内容千亿级实时计算和规则引擎实践优化之路
文章图片
图3-13基于规则引擎的实时信号触发
3.3.1规则管理平台
规则类型
基于不同的业务需求场景 , 规则定义区分了固定规则和动态规则:固定规则:同一规则下所有内容阈值相同 。 动态规则:同一规则下不同内容阈值可以精细化设置 , 用于满足基于内容特征属性需要不同的信号触发阈值的需求场景 。
规则管理
提供规则以及内容阈值的增加、更新、查询等能力 , 并支持如下数据管理能力:规则增删改查:用户可以通过管理端查询规则列表 , 录入和修改规则 。 动态阈值增删改查:提供RestApi对规则下内容的阈值进行新增、更新和查询 。 该能力可支持预估模块训练阈值后 , 将相应阈值更新到规则配置中;同时供规则执行引擎查询规则配置 。
规则定义
配置模块旨在对规则进行进行抽象 , 通过定义通用的规则抽象定义 , 把用户在管理配置信息进行接入存储 。 解耦用户规则定义和规则引擎 , 降低用户输入和规则引擎的依赖 , 这样可以便于我们无负担去升级替换规则引擎而对用户无感 。
腾讯内容千亿级实时计算和规则引擎实践优化之路
文章图片
图3-14规则信息
规则描述包括两部分 , 规则条件表达式+规则动作:表达式条件:上层逻辑支持且/或 , 支持多个运算算子;表达式动作:支持设置触发优先级以及携带特定信息等
3.3.2规则执行引擎
基于上面信号产生的实时信号和规则管理提供的规则信息 , 我们探索了开源的Aviator、FlinkCEP等组件 。 FlinkCEP构建规则执行引擎时有如下问题:不支持规则信息的动态更新 , 用户使用体验较差 。 不支持多规则 , 导致难以平台化 。
Aviator支持丰富的运算符和表达式 , 同时具有轻量级和高性能特点 , 能够完全覆盖我们的场景 。 为此 , 我们选取了Aviator作为规则匹配引擎 。
规则执行引擎主要有如下三个模块:
规则加载
负责进行执行器所需配置的加载和实时感知 , 主要提供如下能力:规则变更秒级感知:负责加载规则列表 , 并保障规则变更后能及时同步 , 包括规则信息变更、规则添加、规则删除等;动态规则的阈值同步:动态规则中 , 每个内容有自己的阈值 。 在进行动态规则匹配时 , 可以实时获取(内容ID、规则ID)对应的阈值 。
规则路由
从输入信号中提取业务渠道 , 和规则中业务渠道进行关联匹配 , 依次路由到不同的规则匹配算子中 。
规则匹配
为不同规则提供相应的匹配能力:固定规则:将获取到的信号和每个规则进行轮询匹配 。 匹配时将规则中表达式和信号作为作为输入 , 通过Aviator进行匹配 , 如果信号满足规则 , 则将信号和规则关联 , 输出到下游 。 动态规则:整体流程和固定规则一致 , 但因为规则中阈值是动态的 , 需要进行设计以适配Aviator:动态阈值作为实体元素放入表达式中(如vv_1_day>=dynamic_value)中 , 将拉取的(内容ID、规则ID)的阈值拼接入输入信号中 , 字段为dynamic_value , 即可以实现动态规则的匹配 。
3.3.3规则匹配优化
并发匹配:由于单个任务计算能力有限 , 把数据分为若干份 , 在多个任务中进行规则匹配 , 极大的提高了规则引擎在大数据量场景下的匹配能力 。
二级缓存:动态规则匹配时 , 需获取(内容ID、规则ID)的阈值 , 因输入信号峰值QPS数十万 , 拉取阈值会有较大网络IO , 造成极大资源开销 。 参考前文ID映射的解决方案 , 我们构建了(内容ID、规则ID)->阈值的二级缓存 , 可以极大节省匹配资源 。