Kafka订阅消费者待读取的消息被删除后会发生什么?
消息队列消费者重启场景结果说明
针对你描述的基于offset的消息队列(以Kafka为典型代表)场景,最终现象和背后逻辑如下:
核心触发现象
消费者重启后首先会收到Broker返回的OFFSET_OUT_OF_RANGE错误,后续执行逻辑完全取决于消费者的auto.offset.reset参数配置。
具体逻辑拆解
- 消费者停止时已经持久化记录了待消费的位置是offset 7,重启后会第一时间向Broker发起拉取offset=7及之后消息的请求
- 此时Broker端offset小于10的消息已经被清理删除,当前分区最小的有效offset为10,无法响应offset=7的拉取请求,直接返回越界错误
- 后续行为按配置分为三类:
- 若
auto.offset.reset配置为earliest:消费者自动将消费位置重置为当前分区最小有效offset(即10),从10开始正常消费,offset7、8、9的消息直接丢失 - 若
auto.offset.reset配置为latest:消费者自动将消费位置重置为当前分区最新的写入offset(即原有最大offset+20),从最新位置开始消费,除了7-9的消息,offset10到新增20条的前序所有消息都会被跳过 - 若
auto.offset.reset配置为none:消费者不会自动重置消费位置,直接抛出异常终止运行,需要人工介入调整消费位置
- 若
注意:如果业务对消息一致性要求高,不允许自动跳过消息,建议将
auto.offset.reset设为none,同时配置offset越界异常告警,出现问题后人工核对消息完整性再手动调整消费位置。
内容的提问来源于stack exchange,提问作者dahuin
相关产品推荐
相关产品推荐

