你有没有遇到过这样的情况:电商App一打开就弹出“满299减50”的优惠,但隔壁老王看到的却是“新用户专享8折”——明明是同一款App,推送内容却各不相同。这不是算法玄学,背后大概率跑着一套规则引擎,配合一套灵活的过滤机制。
规则引擎不是“黑箱”,它像一套可拆装的逻辑积木
简单说,规则引擎就是把业务判断逻辑从代码里抽出来,变成人能看懂、能改、能测试的“条件+动作”。比如风控系统要拦截异常登录,传统写法可能是:
if (ipRegion == "境外" && loginTime < 60 && deviceCount > 3) { blockUser(); }一旦规则变多(比如加个“近7天高频换设备”),if-else 嵌套就容易绕晕人。而规则引擎会把这条逻辑写成类似这样的规则文件:
rule "高风险境外登录"
when
$u: User(ipRegion == "境外")
$l: LoginEvent(user == $u, timeDiff < 60)
accumulate(LoginEvent(user == $u), $cnt: count()) > 3
then
$u.setRiskLevel("HIGH");
end运维或运营人员改个地区、调个阈值,不用动一行Java代码,重启一下规则服务就生效了。
过滤机制是规则引擎的“筛子”,不是所有数据都值得进引擎
光有规则不够,还得讲效率。想象一个日活千万的社交App,每秒产生上万条消息,如果每条都扔进规则引擎逐条判断是否涉黄、是否广告、是否刷屏,CPU怕是要冒烟。这时候就得靠前置过滤机制。
比如先用布隆过滤器快速排除95%的白名单用户;再用正则预筛掉明显不含敏感词的消息体;最后才把剩下的几百条交给Drools或Easy Rules这类引擎做深度语义判断。过滤层越靠前,越轻量,越快——就像快递分拣,先按省份分大包,再按街道拆小包,最后才敲门送上门。
某邮件客户端就用这种思路:收到新邮件后,先过滤掉发件人在联系人列表里的(跳过规则);再过滤掉主题含“Re:”且无附件的(默认非紧急);剩下带PDF附件+标题含“合同”“付款”的,才触发“合同类邮件优先标红+归档到财务夹”这条规则。
别只盯着“引擎”,过滤设计错了,再强的规则也卡死
有团队曾把所有HTTP请求头全塞进规则引擎做UA识别、Referer校验、Token解析……结果QPS刚过500就超时。后来在Nginx层加了一层Lua脚本过滤:非POST请求直接放行;无Authorization头的401拦截;只把POST+带Token+路径含/api/order/的请求转发给后端规则服务。响应时间从2.3秒压到180毫秒。
规则引擎和过滤机制,一个管“判得准”,一个管“筛得快”。它们不是非此即彼的选择题,而是搭积木时的底座和模块——底座稳了,模块才能往上堆得高、换得勤。