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.根据消息大小,您的网络可能无法赶上高负载?检查吞吐量是否不是瓶颈。

Logo

华为开发者空间,是为全球开发者打造的专属开发空间,汇聚了华为优质开发资源及工具,致力于让每一位开发者拥有一台云主机,基于华为根生态开发、创新。

更多推荐