生产者发送超时、Broker 重试和消费者确认丢失都会带来重复消息。这不是异常实现,而是分布式通信中无法同时获得确定结果和零重复的自然代价。
消费者必须幂等
每条业务消息携带稳定的事件 ID。消费者可以用数据库唯一约束记录处理结果,或者让业务更新本身具备条件判断。仅在 Redis 中记录去重标记速度快,但需要考虑过期、持久化和缓存故障。
提交顺序
如果先确认消息再提交数据库,进程崩溃会丢业务结果;如果先提交数据库再确认,确认失败会产生重复。后者配合幂等消费者通常更容易获得可靠结果。
重试应有上限和退避策略。持续失败的消息进入死信队列,并保留错误原因、重试次数和原始载荷,方便人工修复后重新投递。