Kafka producer TimeoutException: Expiring 1 record(s)

15 篇文章 0 订阅

1.问题描述:

Kafka-configuration:

spring.kafka.producer.retries=0
spring.kafka.producer.batch-size=100000
spring.kafka.producer.request.timeout.ms=30000
spring.kafka.producer.linger.ms=10
spring.kafka.producer.acks=0
spring.kafka.producer.buffer-memory=33554432
spring.kafka.producer.max.block.ms=5000
spring.kafka.bootstrap-servers=192.168.1.161:9092,192.168.1.162:9093

报错信息:

2017-10-05 07:24:11, [ERROR] [my-service - LoggingProducerListener - onError:76] Exception thrown when sending a message with key='null' and payload='{"deviceType":"X","deviceKeys":[{"apiKey":"X-X-o"}],"devices...' to topic my-test-topic

and org.apache.kafka.common.errors.TimeoutException: Expiring 1 record(s) for my-test-topic-4 due to 30024 ms has passed since batch creation plus linger time

2.问题分析:

1.错误中的第一条线索是30024毫秒已经通过-配置spring.kafka.producer.request.timeout.ms=30000是相关的。此30秒等待用于填充生产者端的缓冲区。

2.当消息发布时,它在生产者端得到缓冲,并等待30秒(见上面的配置)填满。spring.kafka.producer.batch size=100000意味着100KB,因此,如果消息接收负载较低,并且缓冲区在30秒内没有填满更多100KB的消息,那么您可能会看到此消息。

3.spring.kafka.producer.linger.ms=10用于摄取负载较高且生产者希望限制对kafka代理的send()调用的情况。这是在批处理就绪后(即缓冲区填充到100KB的批处理大小后),生产者在向代理发送消息之前将等待的时间。

解决方案:

增加linger.ms以在批处理就绪后保留更长时间的消息。如果需要更多时间来填充批次,请增加request.timeout.ms。

另一种方法:减少批处理大小,或增加request.timeout.ms,或两者兼而有之。

3.问题原因:

有3种可能性:

1.增加request.timeout.ms-这是Kafka等待整个批次在缓冲区中就绪的时间。所以,在您的情况下,若缓冲区中的消息少于100000条,则会发生超时。更多信息请点击此处:[https://stackoverflow.com/a/34794261/2707179]

2.减少批处理大小-与上一点相关,它将更频繁地发送批处理,但它们将包含更少的消息。

3.根据消息大小,您的网络可能无法赶上高负载?检查吞吐量是否不是瓶颈。

  • 0
    点赞
  • 8
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值