Kafka producer TimeoutException: Expiring 1 record(s)
1.问题描述:Kafka-configuration:spring.kafka.producer.retries=0spring.kafka.producer.batch-size=100000spring.kafka.producer.request.timeout.ms=30000spring.kafka.producer.linger.ms=10spring.kafka.producer.a
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)