【发布时间】:2018-03-20 20:35:23
【问题描述】:
我正在使用带有 Spring-boot 的 Kafka:
Kafka Producer 类:
@Service
public class MyKafkaProducer {
@Autowired
private KafkaTemplate<String, String> kafkaTemplate;
private static Logger LOGGER = LoggerFactory.getLogger(NotificationDispatcherSender.class);
// Send Message
public void sendMessage(String topicName, String message) throws Exception {
LOGGER.debug("========topic Name===== " + topicName + "=========message=======" + message);
ListenableFuture<SendResult<String, String>> result = kafkaTemplate.send(topicName, message);
result.addCallback(new ListenableFutureCallback<SendResult<String, String>>() {
@Override
public void onSuccess(SendResult<String, String> result) {
LOGGER.debug("sent message='{}' with offset={}", message, result.getRecordMetadata().offset());
}
@Override
public void onFailure(Throwable ex) {
LOGGER.error(Constants.PRODUCER_MESSAGE_EXCEPTION.getValue() + " : " + ex.getMessage());
}
});
}
}
Kafka-配置:
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
假设我在主题 my-test-topic 中发送了 10 次 1000 条消息。
10 次中有 8 次我成功地在我的消费者中获得了所有消息,但有时我得到以下 错误:
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
和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
【问题讨论】:
-
您描述的这个错误是来自生产者还是消费者?
-
生产者收到此错误
-
所以,对于这样一个“低”
request.timeout.ms,您的批次太慢了。试着把batch-size调低一点 -
30秒还不够吗?(我是Kafka新手,请多包涵)
-
我不知道,但根据您的错误,您确实超过了 30 秒:
due to 30024 ms has passed
标签: apache-kafka kafka-consumer-api kafka-producer-api spring-kafka