目录

有序消费消息

防止消息被重复消费


 

有序消费消息

 

注意:所谓有序指的是同一事物的多条消息让唯一的一个消费者消费,并保证消费顺序

造成消息乱序消费的原因有两种 

情况一:

rabbimq 重复消费java rabbitmq如何解决重复消费_rabbitmq

情况二

rabbimq 重复消费java rabbitmq如何解决重复消费_有序_02

 

如何保证消息有序被消费

情况一:

rabbimq 重复消费java rabbitmq如何解决重复消费_幂等_03

情况二:

rabbimq 重复消费java rabbitmq如何解决重复消费_rabbitmq_04

 

 

防止消息被重复消费

 

消息被重复消费的原因

造成消费被重复消费的原因来源于我们之前为了防止消息在消费者端丢失,采用的手动回复MQ的解决方案。如果消费者处理消息成功,手动向MQ回复消息时,网络不稳定,无法回复MQ消费完毕。此时MQ因为收不到消费者的回复而仍然把这条消息保存到MQ中,并重发这条消息到消费者处,此时消费者就收到了2条一毛一样的消息了。

 

如何防止消息被重复消费

我们引入“幂等性”这一概念。幂等性指的是同一操作执行多次,结果不改变,就算重复消费也没问题,因为重复的只会做一次。

1.比如,你拿到这个消息做数据库的insert操作。那就容易了,给这个消息做一个唯一主键,那么就算出现重复消费的情况,就会导致主键冲突,避免数据库出现脏数据。

2.再比如,你拿到这个消息做redis的set的操作,那就容易了,不用解决,因为你无论set几次结果都是一样的,set操作本来就算幂等操作。

3.如果上面两种情况还不行,上大招。准备一个第三方介质,来做消费记录。以redis为例,给消息分配一个全局id,只要消费过该消息,将<id,message>以K-V形式写入redis。那消费者开始消费前,先去redis中查询有没消费记录即可。