MQ在互联网公司中是广泛应用的,也是程序员必备技能,在MQ的开发运维中,重复消息问题必然都会遇到,只有真正做过的同学才能讲出重复消息发生的原因,并给出相应的解决方案。
这要从MQ的机制说起,MQ最基本功能要保证产生和接收到消息,并把消息发送出去,所以它在实现的时候一般有这些功能:消息超时重传或者等待确认等机制,这样会使得消息会重复发送,那么重复发送就会产生重复消息。
参考下图:
从生产者这端分析如下:
综述,生产者发送消息到MQ过程中,由于各种原因,收不到应答消息,触发了生产者的重试功能,而产生重复消息。
从消费者这端分析如下:
综述,消费者消息过程中,反馈消费状态,由于各种原因,导致消息队列无法更新投递状态,触发的重试功能,而产生重复消息。
采用幂等操作,什么是幂等操作?举2个sql例子就明白了
update tableA set num=10 where id =1
update tableA set num=num+10 where id =1
第一条sql语句,无论执行多少次,num都等于10,也就是对num字段来说,执行多次sql没影响,所以称为幂等操作。第二条语句,则相反,每次执行,num都会变化,所以称为非幂等操作。
实际操作过程中,实现幂等操作有几种方式
我们用去重表的时候,其实可以把id放在缓存中,每次去检查id时候,可以从缓存获取,从而减轻数据库的压力。
留言与评论(共有 0 条评论) |