公告轮询接口每分钟收到 400 多次请求,数据库 CPU 打到 90%,日志里同一个 IP 一秒查八次,返回内容完全一样。第一次遇到会往复杂处想,其实漏掉的多是个小前提。

$data = get_transient( 'notice_feed' );
if ( false === $data ) {
    $data = notice_query();
    set_transient( 'notice_feed', $data, 60 );
}

前端每五秒轮询一次,接口每次都查库,没有缓存也没有频率限制。多标签页各开一个轮询,请求量按标签数翻倍。这一点先确认清楚,后面就不用反复试。

「公告接口请求频率」相关的日志我一般连着看前后五分钟,单看一条报错经常判断不出是哪一步失败。把这次用到的命令存进笔记,比记住结论有用,换个环境还能照着走。

改完隔一天再看一次,当场正常不代表能稳住。测试环境和线上的差别,往往就在版本号和那几行被忽略的配置上。

具体做法是,接口结果存 transient 六十秒,命中缓存直接返回;前端改成页面可见时才轮询,隐藏标签页暂停;用压测工具打一百次,确认数据库查询次数只有个位数。

改完照着核一遍,一分钟内接口只查库一次,数据库 CPU 回落到 20% 以下。

作者 9823189