使用KafkaTemplate循环发送消息时是否会丢失消息?
KafkaTemplate在Broker故障恢复后的消息处理逻辑
前提场景
使用Spring Boot的KafkaTemplate以循环方式发送消息:
list.forEach(value -> kafkaTemplate.send(topic, value));
生产者配置acks=1,单Broker环境,发送过程中第n条消息开始Broker无法返回确认,第n+k条消息发送时Broker恢复正常。
具体处理逻辑
- 未成功消息的缓存与自动重试:Kafka生产者客户端默认开启重试机制,当Broker无法返回ack时,第n至n+k-1条消息不会被直接丢弃,而是暂存在生产者的内存缓冲区中。生产者会按照配置的重试间隔(默认
retry.backoff.ms=100)自动重试发送这些消息,直到发送成功或达到重试次数上限(默认retries=2147483647,即无限重试)。 - Broker恢复后的发送顺序:当Broker恢复正常后,生产者后台线程会优先处理缓冲区中未发送成功的消息,待这些消息得到Broker确认后,才会继续处理后续的第n+k条消息(若第n+k条消息已被加入缓冲区,会按照队列顺序等待前置消息处理完成后再发送)。
- 消息丢失的触发条件:只有当重试次数耗尽且Broker仍未恢复时,未成功的消息才会丢失(此时可通过
ListenableFuture捕获失败回调)。默认配置下重试次数极高,只要Broker能在合理时间内恢复,消息不会丢失。
内容的提问来源于stack exchange,提问作者Mikhail Geyer
相关产品推荐
相关产品推荐

