RabbitMQ系列教程六:如何处理消费过程中的重复消息?

在这里插入图片描述

介绍

看到本节的题目你有可能会想怎么会遇到消费重复消息的场景呢?
生产者只发送一次不就行了,或者消息队列自动把重复的消息丢掉不就行了

当生成者成功发送消息到broker,但是没有得到响应时,会重新发送消息到broker,此时broker中就会有重复的消息。如果不重试的话就有可能造成消息丢失。

MQTT协议中阐明了消息传递的三种服务质量,这三种服务质量从低到高是

  1. At most once:至多一次,消息在传递时,最多被送达一次
  2. At least once:至少一次,消息在传递时,至少被送达一次
  3. Exactly once:恰好一次,消息在传递时,恰好被送达一次

消息队列是可以把重复的消息丢掉,但实现成本很高,收益却很低。

我来举个例子,当消费者消费消息成功,但是ack失败,此时broker还是会发一条重复的消息到消费者,消费者还得保证方法的幂等。

所以消息队列允许少量的重复消息,在业务层面对方法做幂等是最佳的实现方式,我们常用的消息队列如RabbitMQ,RocketMQ,Kafka的服务质量都是At least once

如何保证方法的幂等呢?

使用唯一索引

对业务唯一的字段加上唯一索引,这样当数据重复时,插入数

猜你喜欢

转载自blog.csdn.net/zzti_erlie/article/details/108954561