幂等性
幂等性是指对同一个操作进行多次执行所产生的影响相同,即多次执行和一次执行的效果是一样的。在计算机领域中,幂等性通常用于描述某个操作或请求的性质。
一、消息幂等性
消息幂等性(Message Idempotency) 指的是一个消息发送多次,接收方能够得到同样的处理效果,就像只发送了一次一样。
即支持消息可重入,可重复消费,但即使重复消费也不会因此引发其他错误。
重复处理相同的消息可能会导致系统的状态不一致或者数据的错误
二、出现重复消费的场景
- 消费者断线后恢复连接并尝试再次消费未处理的消息。
- 消息持久化存储,当系统重启或服务崩溃,消息再次进入队列被处理。
- 使用消息确认机制,如果确认失败,消息会重新被放入队列。
- 由于消息队列本身的问题,消息可能会被重复发送。
- 由于消费者的问题,消息可能会被重复消费。
三、常见解决方式
-
唯一ID标识:
每个消息都有一个唯一的ID(消息携带的唯一标识或hashcode等),消费端通过这个ID来判断是否已经处理过,避免重复操作。 -
消息删除标记:
消费成功后,将消息从队列中移除或标记为已处理,防止后续再消费。 -
幂等操作:
设计操作本身就是幂等的,即对数据的影响不论执行多少次都是相同的,比如更新计数器这类操作。 -
使用版本控制:
记录每一次变更的操作版本,只有最新的版本生效,旧版本可以忽略。 -
消息在发布之前执行去重操作,减少重复发送
-
消息确认机制:
指当消费者从消息队列中获取到一条消息后,需要向消息队列确认(ack)已经消费完成。只有在确认完成后,消息队列才会将该消息从队列中移除,并且不会再次发送给其他消费者。
通过消息确认机制,可以保证每个消息只被处理一次,避免重复消费
7.限制消费者数量:
在某些特定场景小某些消息只发送给指定的消费者去消费,从而减少错误 -
事务消息:
事务消息可以保证消息仅被处理一次。在发送事务消息时,消息发送方先发送一条半事务消息,等到消息处理完毕之后再发送一条确认消息。只有确认消息发送成功,半事务消息才算发送成功,否则半事务消息将在一定时间内重发,直到发送成功或者达到最大重试次数。通过这种方式可以避免消息重复发送或重复处理。 -
分布式锁
在消息队列中,由于消费者可能存在多个实例,因此需要考虑分布式锁的问题。分布式锁可以保证同一时间只有一个消费者实例处理消息,从而避免重复消费的问题。
具体实现如下:
在发送消息之前,使用分布式锁来获取一个唯一标识符。
将该唯一标识符作为消息的 ID,并将其发送到消息队列中。
当消费者接收到消息时,再次使用该唯一标识符来获取分布式锁。
如果分布式锁获取成功,则表示该消息没有被处理过,可以继续进行业务逻辑处理。
如果分布式锁获取失败,则表示该消息已经被其他消费者处理过,直接忽略即可
部分参考链接https://blog.csdn.net/qq_39654841/article/details/129342765