介绍
看到本节的题目你有可能会想怎么会遇到消费重复消息的场景呢? 生产者只发送一次不就行了,或者消息队列自动把重复的消息丢掉不就行了
当生成者成功发送消息到broker,但是没有得到响应时,会重新发送消息到broker,此时broker中就会有重复的消息。如果不重试的话就有可能造成消息丢失。
MQTT协议中阐明了消息传递的三种服务质量,这三种服务质量从低到高是
At most once:至多一次,消息在传递时,最多被送达一次
At least once:至少一次,消息在传递时,至少被送达一次
Exactly once:恰好一次,消息在传递时,恰好被送达一次
消息队列是可以把重复的消息丢掉,但实现成本很高,收益却很低。
我来举个例子,当消费者消费消息成功,但是ack失败,此时broker还是会发一条重复的消息到消费者,消费者还得保证方法的幂等。
所以消息队列允许少量的重复消息,在业务层面对方法做幂等是最佳的实现方式,我们常用的消息队列如RabbitMQ,RocketMQ,Kafka的服务质量都是At least once
如何保证方法的幂等呢?
使用唯一索引
对业务唯一的字段加上唯一索引,这样当数据重复时,插入数