• father::运维

  • 高级 后端

  • ​幂等性​​是一个数学概念,在计算机科学中,它指的是一个操作执行一次与执行多次的效果是一样的。​​实现消息去重的本质就是让消息的处理逻辑具备幂等性。​​ 常见的实现方案:

  1. ​利用数据库唯一键​

    • 在消费者端,在处理消息前,先尝试将消息的全局唯一ID插入到一张“已处理消息表”中。
    • 由于这个ID是唯一的,如果插入成功,说明是第一次处理,继续执行业务逻辑。
    • 如果插入失败(因为重复键错误),说明这条消息之前已经被处理过了,直接丢弃或确认即可。
    • 这是最简单、最有效的方案之一。
  2. ​利用Redis等缓存的原子性​

    • 使用 SET key value NX 命令(如果不存在才设置)。 key 可以是消息的唯一ID。
    • 如果设置成功,处理消息。
    • 如果设置失败,说明已处理过,跳过。
  3. ​业务状态机​

    • 适用于业务本身有状态流转的场景(例如:订单状态 待支付已支付已发货)。
    • 消费者在处理消息时,先检查当前业务对象的状态。
    • 如果状态已经是消息目标状态(或更终态),则说明已经处理过,直接跳过。
    • 例如:支付成功的消息到来,先检查订单状态,如果已经是“已支付”,就不再执行重复的加积分、发货等操作。