面试官心理分析
其实这是很常见的一个问题,这俩问题基本可以连起来问。既然是消费消息,那肯定要考虑会
不会重复消费?能不能避免重复消费?或者重复消费了也别造成系统异常可以吗?这个是 MQ
领域的基本问题,其实本质上还是问你使用消息队列如何保证幂等性,这个是你架构里要考
虑的一个问题。
面试题剖析
回答这个问题,首先你别听到重复消息这个事儿,就一无所知吧,你先大概说一说可能会有
哪些重复消费的问题。
首先,比如 RabbitMQ、RocketMQ、Kafka,都有可能会出现消息重复消费的问题,正常。因为
这问题通常不是 MQ 自己保证的,是由我们开发来保证的。挑一个 Kafka 来举个例子,说说怎
么重复消费吧。
Kafka 实际上有个 ow set 的概念,就是每个消息写进去,都有一个 ow set,代表消息的序号,然
后 consumer 消费了数据之后,每隔一段时间(定时定期),会把自己消费过的消息的 ow set
提交一下,表示“我已经消费过了,下次我要是重启啥的,你就让我继续从上次消费到的 ow set
来继续消费吧”。
但是凡事总有意外,比如我们之前生产经常遇到的,就是你有时候重启系统,看你怎么重启
了,如果碰到点着急的,直接 kill 进程了,再重启。这会导致 consumer 有些消息处理了,但是
没来得及提交 ow set,尴尬了。重启之后,少数消息会再次消费一次。
举个栗子。
有这么个场景。数据 1/2/3 依次进入 kafka,kafka 会给这三条数据每条分配一个 ow set,代表这
条数据的序号,我们就假设分配的 ow set 依次是 152/153/154。消费者从 kafka 去消费的时候,
也是按照这个顺序去消费。假如当消费者消费了 offset=153 的这条数据,刚准备去提交
ow set 到 zookeeper,此时消费者进程被重启了。那么此时消费过的数据 1/2 的 ow set 并没有提
交,kafka 也就不知道你已经消费了 offset=153

文章讨论了在MQ系统中如何处理重复消费的问题,特别是Kafka的情况。由于MQ本身不保证消息的幂等性,开发者需要在设计时考虑如何确保幂等性。举例说明了消费者在处理消息时可能出现的重复消费场景,以及如何通过数据库唯一键、数据检查或全局ID来保证幂等性,防止数据错误。
最低0.47元/天 解锁文章
170

被折叠的 条评论
为什么被折叠?



