本地消息表里 status=0 的记录涨到 3200 条,最早一条 create_time 停在昨天 09:14。relay 任务每轮日志只有一句「本轮扫描 0 条」,表却在继续长。日志里能对上时间点,这种反而好排。
relay 按 update_time 升序取前 200 条再逐条投递,投递失败只加 retry_count,没有动 update_time。失败的那批一直卡在队首,后面新写入的记录永远排不上。这一点先确认清楚,后面就不用反复试。
SELECT id, biz_id, status FROM outbox WHERE status = 0 AND create_time > '2026-03-01' ORDER BY id LIMIT 200; SHOW INDEX FROM outbox;
围绕「本地消息表投递」排查时,命令行跑一遍比在面板里点十次有用,面板会替你做掉不少隐式操作。偶发问题先统计频率,一小时几次和一天一次,查法完全不同。
改完顺手把文档补一句,省得下次自己重新推一遍。监控和日志的时间要对上,时区不一致会多绕很大一圈。
处理上按这个顺序:把扫描条件从 update_time 换成 create_time 加 status=0;投递失败的记录单独进一张重试表 不要和待投递混在一条队列;每轮按 id 游标往后取 避开队首阻塞;给 status 和 create_time 建联合索引。
结果对不对很好判断,下一轮 relay 日志的扫描条数不再为 0 status=0 的计数开始往下走。
