机顶盒请求
三、机顶盒请求匹配逻辑流程 (规则引擎)
当业务系统(如任务推送)需要获取当前设备匹配的业务内容时,执行以下流程。
1、主要是从缓存取数据,但是如果缓存未命中则需要加分布式锁后查询数据库,查询到数据库则更新redis缓存,查询不到也要设置一个对应Key的防穿透占位符。
2、除了查询r:m:r:{mac}的key数量太多不能用本地换成以外,其它key查询要再加入二级缓存,过期时间用全局过期时间,现在是2分钟,降低redis的压力。
请求处理流程图 (规则引擎)
匹配步骤详解 (规则引擎)
- 请求输入: 业务模块传入 【
设备MAC或者设备MAC+CPU】 和业务类型 (BusinessType)。 - 信息补全: 规则引擎根据 MAC 查询设备详细画像(包括渠道、地区、硬件配置等)。
- 初筛候选规则:
- 步骤 A: 查询
r:m:r:{mac}(MAC -> 规则ID) 获取 MAC专属规则集合 (macRuleIds)。 - 步骤 B: 查询
r:btype:r:{business_type}(业务类型 -> 规则ID) 获取 该业务类型的规则集合 (businessTypeRuleIds)。 - 步骤 C: 查询
r:c:r:{channel_id}(渠道ID -> 规则ID) 获取 渠道关联规则集合 (channelRuleIds)。 - 步骤 D: 查询
r:no:limit:r(无设备限制-->规则ID) 获取 无设备限制的规则集合 (noLimitRuleIds)。
- 步骤 A: 查询
- 集合运算:
- 候选规则集合 = (
macRuleIds∪noLimitRuleIds∪channelRuleIds) ∩businessTypeRuleIds
- 候选规则集合 = (
- 规则计算 (LiteFlow):
- 遍历候选规则集。
- 从缓存
data:base:rule:{rule_id}(规则ID->规则详情) 加载规则详情。 - 先判断下规则详情中是否有地区限制,如果有,则判断设备地区是否在规则地区范围内,不在则跳过该规则。
- 将设备详情数据注入 LiteFlow 上下文。
- 执行 EL 表达式进行匹配计算。
- 收集计算结果为
True的规则ID。
- 查看是否有数量限制:
- 根据匹配成功的
RuleID,查询r:r:btype:b:{rule_id}(规则ID+业务类型 -> 业务ID) 获取全部 业务ID集合。 - 遍历业务ID集合,从
r:btype:b:limit:{business_type}(业务类型->业务ID->剩余数量限制信息)中获取数量信息,判断剩余数量是否满足要求,如果没有余量就从业务ID集合中移除,这里不能用本地二级缓存,需要全部从redis取,除非是防缓存穿透值。
- 根据匹配成功的
- 结果输出:
- 返回业务ID集合给调用方,如任务推送ID集合。
四、高级功能说明 (规则引擎)
- 计算设备总数方法:人工触发计算,默认不算,异步处理,同时只允许计算两条规则。
- 按规则导出设备清单:异步任务。
- 计数器机制:关于推送、黑名单卸载、launcher 广告位推送计数器?规则本身不设置数量限制,因为一条可以关联多个业务,一个业务可以关联多个规则,而数量限制一般是限制单个业务。
五、审批与一致性 (规则引擎)
若规则关联到需要审批的业务,则该规则在 rule_business (规则关联业务表) 中只能绑定一个业务实体,不可复用。以下机制在此前提下生效:
- 被规则表关联的
rule_mac_resource资源,不可再被其他规则关联。 - 审批触发与锁定:
- 当以下任一数据发生修改:
rule_mac_resource_item(MAC资源关联MAC)、rule_mac_item(规则关联MAC表)、rule_channel_item(规则关联渠道表)、rule_business(规则关联业务表),即触发审批。 - 规则表将关联数据的状态字段更新为“待审批相关”,并通过 MQ 将消息推送到对应
businessType的主题。 - 规则引擎订阅 BPM 模块的流程状态变更消息以更新规则表整体状态;若该规则关联的业务处于审批中,则其子数据(MAC列表、渠道列表、业务绑定)一律锁定,禁止修改。
- 当以下任一数据发生修改:
- 业务系统订阅第 2 步的消息后,将业务表相关字段同步标记为“待审批相关”。
- 业务系统按流程提交审批;审批通过后,规则引擎订阅 BPM 的 MQ 消息进行数据库状态更新 为审批通过并刷新 Redis 缓存,确保现网数据一致性。