首先明确什么叫幂等性。
幂等性:用户对于同一操作发起的一次请求或者多次请求的结果是一致的,不会因为多次点击而产生副作用。
MQ中的消息会产生重复性消费的问题:消费者消费之后会返回ack给MQ,但是此时如果网络不好,故MQ未收到确认消息,该条消息会发给其他消费者或者网络好了之后再次发送给该消费者,但实际上这条消息已经被消费过了。这就是消费者消费重复的消息。
对于消费端幂等性保障的解决方案
-
唯一Id+指纹码机制
指纹码:利用一些规则或者时间戳拼接生成而来,但是一定要保证唯一性,查询他是否存在于数据库中。优势就是:简单。劣势:单个数据库会有写入性能瓶颈。
-
Redis原子性
利用Redis执行setnx命令,天然具有幂等性。从而实现不重复消费。