什么是消息幂等性?为什么会出现消息重复消费,如何保证或解决消息幂等性,保证或解决消息幂等性的方式

幂等性

幂等性是指对同一个操作进行多次执行所产生的影响相同,即多次执行和一次执行的效果是一样的。在计算机领域中,幂等性通常用于描述某个操作或请求的性质。

一、消息幂等性

消息幂等性(Message Idempotency) 指的是一个消息发送多次,接收方能够得到同样的处理效果,就像只发送了一次一样。

即支持消息可重入,可重复消费,但即使重复消费也不会因此引发其他错误。

重复处理相同的消息可能会导致系统的状态不一致或者数据的错误

二、出现重复消费的场景

  1. 消费者断线后恢复连接并尝试再次消费未处理的消息。
  2. 消息持久化存储,当系统重启或服务崩溃,消息再次进入队列被处理。
  3. 使用消息确认机制,如果确认失败,消息会重新被放入队列。
  4. 由于消息队列本身的问题,消息可能会被重复发送。
  5. 由于消费者的问题,消息可能会被重复消费。

三、常见解决方式

  1. 唯一ID标识
    每个消息都有一个唯一的ID(消息携带的唯一标识或hashcode等),消费端通过这个ID来判断是否已经处理过,避免重复操作。

  2. 消息删除标记
    消费成功后,将消息从队列中移除或标记为已处理,防止后续再消费。

  3. 幂等操作
    设计操作本身就是幂等的,即对数据的影响不论执行多少次都是相同的,比如更新计数器这类操作。

  4. 使用版本控制
    记录每一次变更的操作版本,只有最新的版本生效,旧版本可以忽略。

  5. 消息在发布之前执行去重操作,减少重复发送

  6. 消息确认机制
    指当消费者从消息队列中获取到一条消息后,需要向消息队列确认(ack)已经消费完成。只有在确认完成后,消息队列才会将该消息从队列中移除,并且不会再次发送给其他消费者。
    通过消息确认机制,可以保证每个消息只被处理一次,避免重复消费
    7.限制消费者数量:
    在某些特定场景小某些消息只发送给指定的消费者去消费,从而减少错误

  7. 事务消息
    事务消息可以保证消息仅被处理一次。在发送事务消息时,消息发送方先发送一条半事务消息,等到消息处理完毕之后再发送一条确认消息。只有确认消息发送成功,半事务消息才算发送成功,否则半事务消息将在一定时间内重发,直到发送成功或者达到最大重试次数。通过这种方式可以避免消息重复发送或重复处理。

  8. 分布式锁
    在消息队列中,由于消费者可能存在多个实例,因此需要考虑分布式锁的问题。分布式锁可以保证同一时间只有一个消费者实例处理消息,从而避免重复消费的问题。
    具体实现如下
    在发送消息之前,使用分布式锁来获取一个唯一标识符。
    将该唯一标识符作为消息的 ID,并将其发送到消息队列中。
    当消费者接收到消息时,再次使用该唯一标识符来获取分布式锁。
    如果分布式锁获取成功,则表示该消息没有被处理过,可以继续进行业务逻辑处理。
    如果分布式锁获取失败,则表示该消息已经被其他消费者处理过,直接忽略即可

部分参考链接https://blog.csdn.net/qq_39654841/article/details/129342765

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值