访问日志里同一个 IP 每秒请求几十次搜索接口,关键词随机生成,数据库负载被拉满,接口响应也变慢。碰到这种情况,我一般先确认改动有没有真的生效。
原因不复杂,搜索接口没有频率限制,每次请求都触发一次全表匹配,随机词还绕过了结果缓存,数据库只能彻底硬扛,很快就会顶不住。
「搜索接口防刷」相关的验证我通常做两遍,改完一次、隔天再看一次,确认不是临时生效。日志级别临时调高可以,记得改回去,长期开着既占磁盘又掩盖真问题。
limit_req_zone $binary_remote_addr zone=s:10m rate=5r/s;
location = /search {
limit_req zone=s burst=5 nodelay;
}
权限不要一口气开到最大,先加到够用再往上试,范围小才好收。把复现步骤压到三条以内,交给同事也能跑出来,才算真的定位清楚。
具体做法是,按来源 IP 和关键词这两个维度一起去做频次限制;相同关键词的搜索结果做短时缓存,减少重复查询;异常来源直接拒绝掉,别再让它继续去压数据库。
最后用这个标准收尾,压测时数据库负载平稳,异常来源会收到 429 响应,正常用户不受影响。
