网关上有两条规则,一条按路由限 1000 QPS,一条按用户限 10 QPS。压测时同一个用户的请求有时通过有时 429,日志里两条规则的判定结果相反,间隔不到 1 毫秒。日志里能对上时间点,这种反而好排。

规则放在一个无序的 Map 里遍历,命中即返回,先跑到哪条看哈希顺序。两条规则没有优先级字段,也没有合并策略,结果随重启变化。这一点先确认清楚,后面就不用反复试。

SELECT rule_id, priority, dimension, threshold FROM flow_rule ORDER BY priority;
UPDATE flow_rule SET priority = 10 WHERE rule_id = 7;
UPDATE flow_rule SET priority = 20 WHERE rule_id = 9;

「限流规则冲突」确认了原因之后,改动尽量只碰那一处,顺手改的东西后面最容易出问题。能分两步做的操作就别合成一步,中间看一眼返回值,出问题好判断。

报错里带路径的,先去看那个路径在不在、权限对不对。

处理上按这个顺序:规则加 priority 字段 按数值顺序执行;明确合并策略 用户维度优先于路由维度;把所有规则的同时命中情况打日志 观察一周。

结果对不对很好判断,同一用户压测 10 分钟结果稳定,429 全部由用户维度规则触发,路由规则从未单独拒绝。

作者 9823189