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

    科技2024-10-19  19

    介绍

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

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

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

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

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

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

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

    如何保证方法的幂等呢?

    使用唯一索引

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

    Processed: 0.013, SQL: 8