KafkaTemplate阻塞获取send返回结果的发送逻辑及顺序保证问题
问题1解答
- 调用
KafkaTemplate.send()之后,哪怕你后续调用返回的ListenableFuture的get()方法阻塞等待,消息发送逻辑仍然会严格遵循Kafka生产者的linger.ms、批量大小等原生配置规则,不会被强制立即发送。 get()方法的作用只是阻塞当前线程,等待Kafka生产者端完成整个消息发送流程(包括缓冲、攒批、发送、收到Broker确认)后返回结果,不会改变生产者本身的发送缓冲逻辑。如果你配置了linger.ms=5,那就算你刚调用完send()就立刻执行get(),生产者还是会等够5ms或者攒满设定的批量大小才会真的把请求发往Broker,这段等待时间都会算在get()的阻塞时长里。
问题2解答
- 这种逐条发送并调用
get()阻塞等待返回的场景,在key相同的前提下,默认可以保证这些消息按发送顺序到达对应topic。 - 原因是:相同key的消息默认会路由到同一个分区,而你每次调用
get()都会等前一条消息已经被Broker确认写入成功之后,才会触发下一条消息的发送流程,相当于强制串行发送,自然不会出现乱序。 - 额外注意:如果开启了生产者重试同时把
max.in.flight.requests.per.connection配置为大于1的值,普通非阻塞批量发送的场景下可能出现乱序,但你逐条get()的场景下不会同时存在多个发送中请求,所以不会触发这个异常场景。
内容的提问来源于stack exchange,提问作者kalan
相关产品推荐
相关产品推荐

