-
father::运维
-
幂等性是一个数学概念,在计算机科学中,它指的是一个操作执行一次与执行多次的效果是一样的。实现消息去重的本质就是让消息的处理逻辑具备幂等性。 常见的实现方案:
-
利用数据库唯一键
- 在消费者端,在处理消息前,先尝试将消息的全局唯一ID插入到一张“已处理消息表”中。
- 由于这个ID是唯一的,如果插入成功,说明是第一次处理,继续执行业务逻辑。
- 如果插入失败(因为重复键错误),说明这条消息之前已经被处理过了,直接丢弃或确认即可。
- 这是最简单、最有效的方案之一。
-
利用Redis等缓存的原子性
- 使用
SET key value NX命令(如果不存在才设置)。 key 可以是消息的唯一ID。 - 如果设置成功,处理消息。
- 如果设置失败,说明已处理过,跳过。
- 使用
-
业务状态机
- 适用于业务本身有状态流转的场景(例如:订单状态 待支付→已支付→已发货)。
- 消费者在处理消息时,先检查当前业务对象的状态。
- 如果状态已经是消息目标状态(或更终态),则说明已经处理过,直接跳过。
- 例如:支付成功的消息到来,先检查订单状态,如果已经是“已支付”,就不再执行重复的加积分、发货等操作。