我们使用MQ的时候肯定是消息是准确的,既不能多也不能少。那我们来看看什么情况下可能会出现重复消费的情况。
重复消费情景
一般来说消费者消费完消息后,会ack到MQ然后MQ会删除这条消息。但假设由于网络原因这条ACK丢失了,又或者此时我kill掉了消费端的应用。MQ没有收到确认信息,认为该消息没有被消费成功,还会分发给其他消费者。
方案的思路
重复消费是消费者的事情,MQ并不保障这些。
-
从生产者那边,尽量保证消息的唯一性
TODO
-
从消费者这边,保证消费的唯一性
- 对于同一条数据出现2次,可以业务唯一性来去重。
例如update数据库,通过业务主键来避免重复让数据只允许出现一条;
也可以通过redis来去重,每次消费时判断缓存是否已经消费过。 - 保证系统的幂等性,不排除重复。
有的时候重复消费并不会影响业务,没有必要去管小概率的事件而导致过度设计。
总之,重复消费的事情最好由消费方来处理。如果消费方自身就有相同数据去重的逻辑,我们就无需考虑重复消费的问题(毕竟相同的数据包括重复同一条数据)。
网友评论