INSERT INTO mq_consume_log(msg_key, group_id, created_at)
VALUES ('PAY20261109001', 'account-consumer', NOW())
ON DUPLICATE KEY UPDATE msg_key = msg_key;

同一条支付结果消息被消费两次,账户余额多加了一笔,两条处理日志的时间只差 40 毫秒。这类现象通常不是突然出现的,往前翻半天日志能看到苗头。

追下去是这么回事:至少一次投递本身就允许重复,业务侧没有唯一键约束,任何一次重试或者重平衡都会变成重复入账。

围绕「消息幂等设计」排查时,命令行跑一遍比在面板里点十次有用,面板会替你做掉不少隐式操作。同一份配置存在多处的,先确认改的是被加载的那一份。

新版本先放一台机器上跑一天再全量,问题一般在这段时间暴露。备份不是备了就行,恢复一次才算数,很多备份文件打开才发现是空的。

处理上按这个顺序:用业务单号加消费组拼成唯一键 写进业务库;幂等记录和业务更新放进同一个数据库事务里;撞唯一键冲突就直接返回成功 不再执行业务。

确认没问题再收工,把同一消息重复投递十次,账户余额只增加一笔且无报错。

作者 9823189