消费者收到消息去查订单,返回 null,重试三次后把消息丢了。生产端日志显示消息发送时间比事务提交早了 30 毫秒。第一次遇到会往复杂处想,其实漏掉的多是个小前提。
SELECT msg_id, order_no, consume_time, retry_times FROM consume_log WHERE order_no = '20260301018' ORDER BY consume_time;
消息先发后提交,消费端可能在提交之前就完成消费。查不到数据按失败处理,重试次数用完进死信,事务这时才提交。这一点先确认清楚,后面就不用反复试。
「消息发送顺序」这类改动最怕改一半,回滚脚本先准备好,再动生产。临时改动用注释写上日期和原因,过两周自己都记不清为什么这么写。
动手前把原文件复制一份带时间戳,出问题立刻换回去,比现场分析快得多。
具体做法是,发送动作挪到事务提交之后 用 afterCommit 回调;消费端查不到数据按延时重试处理 不要直接判失败;重试间隔覆盖提交窗口 至少 30 秒;死信队列加监控 出现即告警。
改完照着核一遍,生产端日志里发送时间晚于提交时间 消费端不再出现查不到订单的记录。
