主题
面试速答(先看这里)
**一句话结论:**这不是重复消费,而是 RocketMQ 的广播模式特性,他就是会把一条消息发送给所有的消费者,但是如果大家处理的逻辑都一样, 那么和重复消费的表现是一样的。
60秒标准回答:
RocketMQ重复消费,指的是同一个消息重复来了多次,那么通常的情况有很多,常见的有以下几个
不管是因为什么情况了,是真的消费失败了,还是出现了异常了,还是明明消费成功了,但是你错误的返回了失败等等情况,只要你给RocketMQ返回的是 RECONSUME_LATER ,那么消息就会重投,有重投就会有重复消费
不只是返回失败的情况,如果消费方法执行时间过长,RocketMQ 可能判定消费者失联,也一样会重投消息。 那就和上面的情况一样了
**答题顺序:**结论 → 原理/机制 → 关键流程 → 场景与取舍 → 易错点
回答主线:
- **Consumer返回给Broker消费失败(常见):**不管是因为什么情况了,是真的消费失败了,还是出现了异常了,还是明明消费成功了,但是你错误的返回了失败等等情况,只要你给RocketMQ返回的是 RECONSUME_LATER ,那么消息就会重投,有重投就会有重复消费。
- **Consumer消费处理超时了(常见):**不只是返回失败的情况,如果消费方法执行时间过长,RocketMQ 可能判定消费者失联,也一样会重投消息。
- **消息发重了(常见):**这种比较常见的,因为有的时候我们调用MQ发送消息的时候,因为网络抖动或者异常,我们会把一些实际成功的消息重发一遍,那么就会有两条一模一样的消息,那么对于消费者来说就可能会重复消费了。
- **重平衡(kafka):**Kafka 在消费者组 rebalance 时,新消费者加入/失败、分区重新分配,如果 offset 没及时提交,重新分配分区时会从老的 offset 重新开始消费。
**记忆锚点:**RocketMQ → Consumer → offset → RECONSUME_LATER → 重平衡(kafka) → rebalance
易错提醒:
- Consumer返回给Broker消费失败(常见) 不管是因为什么情况了,是真的消费失败了,还是出现了异常了,还是明明消费成功了,但是你错误的返回了失败等等情况,只要你给RocketMQ返回的是 RECONSUME_LATER ,那么消息就会重投,有重投就会有重复消费。
- Consumer消费处理超时了(常见) 不只是返回失败的情况,如果消费方法执行时间过长,RocketMQ 可能判定消费者失联,也一样会重投消息。
加分表达:
- 这不是重复消费,而是 RocketMQ 的广播模式特性,他就是会把一条消息发送给所有的消费者,但是如果大家处理的逻辑都一样, 那么和重复消费的表现是一样的。
追问准备:
- 围绕「RocketMQ」:底层原理是什么?使用时有哪些边界和常见坑?
- 围绕「Consumer」:底层原理是什么?使用时有哪些边界和常见坑?
- 围绕「offset」:底层原理是什么?使用时有哪些边界和常见坑?
- 如果线上出现异常,你会如何定位、验证并规避?
典型回答
RocketMQ重复消费,指的是同一个消息重复来了多次,那么通常的情况有很多,常见的有以下几个。
Consumer返回给Broker消费失败(常见)
不管是因为什么情况了,是真的消费失败了,还是出现了异常了,还是明明消费成功了,但是你错误的返回了失败等等情况,只要你给RocketMQ返回的是 RECONSUME_LATER ,那么消息就会重投,有重投就会有重复消费。
Consumer消费处理超时了(常见)
不只是返回失败的情况,如果消费方法执行时间过长,RocketMQ 可能判定消费者失联,也一样会重投消息。 那就和上面的情况一样了。
消息发重了(常见)
这种比较常见的,因为有的时候我们调用MQ发送消息的时候,因为网络抖动或者异常,我们会把一些实际成功的消息重发一遍,那么就会有两条一模一样的消息,那么对于消费者来说就可能会重复消费了。
广播模式
这不是重复消费,而是 RocketMQ 的广播模式特性,他就是会把一条消息发送给所有的消费者,但是如果大家处理的逻辑都一样, 那么和重复消费的表现是一样的。
重平衡(kafka)
打开文档:✅RocketMQ和Kafka一样有重平衡的问题吗?
Kafka 在消费者组 rebalance 时,新消费者加入/失败、分区重新分配,如果 offset 没及时提交,重新分配分区时会从老的 offset 重新开始消费。那么就会重复消费。