Expiring 1 record(s) for 2:xxx ms has passed since batch问题研究
本文主要对该错误相关文章进行整理,供自己以及各位参考,如有问题请及时指出,谢谢。报错大意为:生产发送批次已经创建,但是已经过去120000ms,仍然没有发送,消息过期。主要原因有两类https://stackoverflow.com/questions/46649748/kafka-producer-timeoutexception-expiring-1-records共有3个可能解决方案增大 r
本文主要对该错误相关文章进行整理,供自己以及各位参考,如有问题请及时指出,谢谢。
报错大意为:生产发送批次已经创建,但是已经过去120000ms,仍然没有发送,消息过期。
【20211015更新】(@高警,感谢提供资料)
当kafka服务器磁盘空间不足时,也会报此错误。清空磁盘空间,重启kafka服务即可解决。
主要原因有两类
-
https://stackoverflow.com/questions/46649748/kafka-producer-timeoutexception-expiring-1-records
共有3个可能解决方案
- 增大 request.timeout.ms 配置
这个配置指的是 kafka 等待发送批次大小(以字节为单位)的等待时间,如果超过该时间未满足批次大小,将会超时。 - 减少 batch-size 配置
结合上面原因,降低批次条数,少量多发,减少等待时间。 - 网络原因,无法满足高负载
但是也有人提出疑问:
ling.ms 默认值时0,即使批次大小没有达到,也会立即发送的。
即使为了减少频繁发送的情况,假设设置为20ms(小于过期时间120000ms),那么过了这20ms,尽管批次大小没有到,生产者也会发送该批次的,是不会出现超时情况的。 - 增大 request.timeout.ms 配置
-
该问题提出者,指出 对batch.size linger.ms request.time.out 都进行配置,但是依旧会报错。
仔细查看日志发现,发送消息时,目标topic的目标分区,是负数。
但是在该问题下,未发现更加合理的解决方案以及出现负数的原因,但是,大概率是因为这个问题导致的如标题的报错。 -
个人想法(临时解决该问题)
- 发送消息时,指定某个分区
- 通过ProducerInterceptor重写分区逻辑
但是 要注意 分区逻辑对消费者消费数据是否有影响。
更多推荐
所有评论(0)