参考答案
产生MQ重复消费的问题的原因
- 首先,假如生产者生产数据,生产的数据都有一个offset标号,代表这个数据消费的顺序的序号;
- 例如生产者生产了三条消息152,153,154,这时发送到MQ;
- MQ按照顺序将数据提交到消费者;
- 消费者是定时将消费的数据记录提交到Zookeeper zk中,把记录了现在消费到第几条数据告诉MQ;
- 如果此时消费了152,153消费者重启了,那么记录没提交到zk,此时MQ以为消费者才消费到151,还会重新提交152,153;
- 此时数据就出现了重复的问题,数据库就出现了脏数据。
如何解决mq的重复消费问题
- 重复消费的问题会导致数据库出现脏数据,我们一般通过保证幂等性来解决这个问题。
- 幂等性:是指一次和多次请求某一个资源对于资源本身应该具有同样的结果。
- 保证生产者重复消费数据保证幂等性,有多种方式实现。最简单的在插入数据库的数据加个唯一健,这样插入相同的数据时只会报错,不会出现脏数据。
- 在Redis中存个id,每次操作数据之前查下id是否存在。
- 如果存在,就不做处理;如果不存在,就操作数据库。解决掉幂等性的问题。
以上,是MQ面试题【如何保证消息不被重复消费】的参考答案。
输出,是最好的学习方法。
欢迎在评论区留下你的问题、笔记或知识点补充~
—end—