查询接口限流 50 QPS 运行正常,批量查询接口上线后同样限 50,结果一条批量请求带 200 个 id,实际数据库 QPS 冲到 9000,慢查询从 3 条涨到 400 条。第一次遇到会往复杂处想,其实漏掉的多是个小前提。

SELECT COUNT(*) FROM slow_log WHERE created_at > NOW() - INTERVAL 5 MINUTE;
# 请求数 50 但 SQL 9000 次
SELECT id, item_count FROM batch_request_log ORDER BY item_count DESC LIMIT 5;

限流按请求数计,一条批量请求算一次,权重没有按实际工作量折算。批量入口和单条入口共用同一份规则,阈值也没有区分。这一点先确认清楚,后面就不用反复试。

「批量接口限流权重」相关的验证我通常做两遍,改完一次、隔天再看一次,确认不是临时生效。新版本先放一台机器上跑一天再全量,问题一般在这段时间暴露。

备份不是备了就行,恢复一次才算数,很多备份文件打开才发现是空的。

具体做法是,批量接口单独配规则 阈值按 id 数折算权重;单次批量限制最大 id 数 超过直接返回 400;监控按 SQL 次数而不是请求数设阈值。

改完照着核一遍,批量接口按权重限流后数据库 QPS 稳定在 50 上下,慢查询回落到个位数。

作者 9823189