RabbitMQ重复消费

阿里云国内75折 回扣 微信号:monov8
阿里云国际,腾讯云国际,低至75折。AWS 93折 免费开户实名账号 代冲值 优惠多多 微信号:monov8 飞机:@monov6

1、重复消费的原因

1多个消费者其中一个消费信息后没有通知队列没有给mq发ack或者给mq发ack的过程中挂了、失败了队列又把消息发给了其他消费者就会重复消费。

2对于非幂等性操作要防止重复消费
对于幂等性操作一般不用防止重复消费。
多次操作得到的结果相同就是幂等性操作比如查询属于幂等性操作新增、更新属于非幂等性操作。

2、解决方法

用redis。
在消费者收到消息时先执行setnxsetnx是redis命令是’SET if Not eXists’如果不存在则 SET的简写RedisTemplate中也有对应的方法。setnx执行后如果返回true说明key不存在、设置成功如果返回false说明key已存在、设置失败。

eg我们约定
id=0表示正在执行
id=1表示执行成功

消费者收到消息在执行业务前先用setnx方法试着将id放入redis中

Boolen result = redisTemplate.opsForValue().setIfAbsent(orderId+"_reineforce", "0");

1如果key不存在即setnx返回true消费者就正常消费
2如果key存在即setnx返回false那么就要取出key的值作判断
为0就不消费
为1就说明该消息其他消费者已经消费过了只是发ack没成功这里直接ack就行。

极端情况
第一个消费者正在执行业务时挂了、出现死锁这种怎么办
在setnx的基础上再给key设置一个生存时间防止出现死锁。

阿里云国内75折 回扣 微信号:monov8
阿里云国际,腾讯云国际,低至75折。AWS 93折 免费开户实名账号 代冲值 优惠多多 微信号:monov8 飞机:@monov6
标签: RabbitMQ