使用如下所示的生产者配置,我正在创建在整个应用程序中使用的Singleton生产者:
properties.setProperty(ProducerConfig.BOOTSTRAP_SERVERS_CONFIG, "kafka.consul1:9092,kafka.consul2:9092");
properties.setProperty(ProducerConfig.KEY_SERIALIZER_CLASS_CONFIG, StringSerializer.class.getName());
properties.setProperty(ProducerConfig.VALUE_SERIALIZER_CLASS_CONFIG, StringSerializer.class.getName());
properties.setProperty(ProducerConfig.ACKS_CONFIG, "1");
我已连接到k8s托管的Kafka集群。代理的advertised.listeners
配置为向我返回IP地址而不是主机名。尽管正常情况下一切正常,但重新启动Kafka时会出现问题,有时IP地址会更改。由于生产者只知道较旧的IP,因此它一直尝试连接到该主机以发送消息,而没有消息通过。
我发现发送失败时会引发 org.apache.kafka.common.errors.TimeoutException
异常。当前,消息是异步发送的:
producer.send(data,
(RecordMetadata recordMetadata, Exception e) -> {
if (e != null) {
LOGGER.error("Exception while sending message to kafka", e);
}
});
现在应该如何处理Timeoutexception?由于生产者是在应用程序之间共享的,因此在回调中关闭和重新创建听起来并不正确。
答案 0 :(得分:0)
根据Callback interface上的JavaDoc,TimeoutException
是一个可重试异常,可以通过增加生产者的retries
的数量来处理。< / p>
在Kafka documentation中,您可以找到有关retries
配置的详细信息:
重试(默认值0):设置一个大于零的值将导致客户端重新发送其发送失败并带有潜在的临时错误的任何记录。请注意,此重试与客户端在收到错误后重新发送记录没有什么不同。在不将max.in.flight.requests.per.connection设置为1的情况下允许重试可能会更改记录的顺序,因为如果将两个批次发送到单个分区,并且第一个失败并被重试,但是第二个成功,则记录在第二批中可能会首先出现。