如何保证 MQ 不被重复消费
发布日期:2021-05-08 11:28:01 浏览次数:19 分类:精选文章

本文共 516 字,大约阅读时间需要 1 分钟。

Kafka 在每个 MQ 写入队列时,会给这条数据分配一个序号 offset,consumer 在消费数据时,定期会把自己消费过的 offset 提交一下,告诉消息队列:我已经消费过序号为 X 的 MQ 了,下次从大于序号 X 的最小数据开始消费。

Kafka 内部通过这种方式保证 MQ 不被重复消费。然而这种情况不能保证消费者一定不重复消费,假设生产者在准备上报前进程被杀死,下次系统恢复后就可能重复消费一部分 MQ。

然而重复消费 MQ 并不一定会导致问题,我们可以在消费端增加额外处理解决重复消费问题:

  1. 如果消费 MQ 写数据库,可以在每次插入前判断一下是否已经插入,如果是就执行 UPDATE 操作
  2. 如果消费 MQ 写 Redis,不用处理,redis set 操作天然覆盖原数据
  3. 如果场景比较复杂,可以让生产者对每通消息增加唯一 ID,每次消费 MQ 后将该 ID 保存在缓存中,每次消费 MQ 前判断该 ID 是否被消费

有些简单场景实际上不处理也不会有问题,解决 MQ 重复消费的关键在于保证幂等性,无论采用哪种方式,只要保证重复消费 MQ 后数据不会有问题即可。

幂等性:重复多次相同的请求,确保获得的数据不会改变

上一篇:如何保证MQ的可靠性传输
下一篇:消息队列如何保证高可用

发表评论

最新留言

留言是一种美德,欢迎回访!
[***.207.175.100]2025年04月13日 04时19分35秒

关于作者

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

推荐文章