APP下载

MQ必问面试题:为何会产生重复讯息 你是如何解决的

消息来源:baojiabao.com 作者: 发布时间:2024-05-09

报价宝综合消息MQ必问面试题:为何会产生重复讯息 你是如何解决的

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可以作为唯一id字段,我们做一个扣款操作,我们要保证合理的时间范围内此id的讯息不会重复消费。

总结一下

我们用去重表的时候,其实可以把id放在快取中,每次去检查id时候,可以从快取获取,从而减轻数据库的压力。
2019-07-27 19:56:00

相关文章