Expiring 1 record(s) for 2:xxx ms has passed since batch问题研究

本文主要对该错误相关文章进行整理,供自己以及各位参考,如有问题请及时指出,谢谢。

报错大意为:生产发送批次已经创建,但是已经过去120000ms,仍然没有发送,消息过期。

【20211015更新】(@高警,感谢提供资料)
当kafka服务器磁盘空间不足时,也会报此错误。清空磁盘空间,重启kafka服务即可解决。

主要原因有两类

  1. https://stackoverflow.com/questions/46649748/kafka-producer-timeoutexception-expiring-1-records

    共有3个可能解决方案

    1. 增大 request.timeout.ms 配置
      这个配置指的是 kafka 等待发送批次大小(以字节为单位)的等待时间,如果超过该时间未满足批次大小,将会超时。
    2. 减少 batch-size 配置
      结合上面原因,降低批次条数,少量多发,减少等待时间。
    3. 网络原因,无法满足高负载

    但是也有人提出疑问:
    ling.ms 默认值时0,即使批次大小没有达到,也会立即发送的。
    即使为了减少频繁发送的情况,假设设置为20ms(小于过期时间120000ms),那么过了这20ms,尽管批次大小没有到,生产者也会发送该批次的,是不会出现超时情况的。

  2. https://stackoverflow.com/questions/56807188/how-to-fix-kafka-common-errors-timeoutexception-expiring-1-records-xxx-ms-has

    该问题提出者,指出 对batch.size linger.ms request.time.out 都进行配置,但是依旧会报错。
    仔细查看日志发现,发送消息时,目标topic的目标分区,是负数。
    但是在该问题下,未发现更加合理的解决方案以及出现负数的原因,但是,大概率是因为这个问题导致的如标题的报错。

  3. 个人想法(临时解决该问题)

    1. 发送消息时,指定某个分区
    2. 通过ProducerInterceptor重写分区逻辑
      但是 要注意 分区逻辑对消费者消费数据是否有影响。
  • 7
    点赞
  • 24
    收藏
    觉得还不错? 一键收藏
  • 1
    评论
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值