
如何保证 MQ 不被重复消费
发布日期:2021-05-08 11:28:01
浏览次数:19
分类:精选文章
本文共 516 字,大约阅读时间需要 1 分钟。
Kafka 在每个 MQ 写入队列时,会给这条数据分配一个序号 offset,consumer 在消费数据时,定期会把自己消费过的 offset 提交一下,告诉消息队列:我已经消费过序号为 X 的 MQ 了,下次从大于序号 X 的最小数据开始消费。
Kafka 内部通过这种方式保证 MQ 不被重复消费。然而这种情况不能保证消费者一定不重复消费,假设生产者在准备上报前进程被杀死,下次系统恢复后就可能重复消费一部分 MQ。
然而重复消费 MQ 并不一定会导致问题,我们可以在消费端增加额外处理解决重复消费问题:
- 如果消费 MQ 写数据库,可以在每次插入前判断一下是否已经插入,如果是就执行 UPDATE 操作
- 如果消费 MQ 写 Redis,不用处理,redis set 操作天然覆盖原数据
- 如果场景比较复杂,可以让生产者对每通消息增加唯一 ID,每次消费 MQ 后将该 ID 保存在缓存中,每次消费 MQ 前判断该 ID 是否被消费
有些简单场景实际上不处理也不会有问题,解决 MQ 重复消费的关键在于保证幂等性,无论采用哪种方式,只要保证重复消费 MQ 后数据不会有问题即可。
幂等性:重复多次相同的请求,确保获得的数据不会改变
发表评论
最新留言
留言是一种美德,欢迎回访!
[***.207.175.100]2025年04月13日 04时19分35秒
关于作者

喝酒易醉,品茶养心,人生如梦,品茶悟道,何以解忧?唯有杜康!
-- 愿君每日到此一游!