如果主题不存在,Kafka生产者将挂起

时间:2019-08-08 13:08:23

标签: java apache-kafka kafka-producer-api

我是Kafka的新手,正在尝试实现一个简单的生产者,将数据发送到主题。 如果该主题不存在,那么我想将裁断作为例外处理。

private Producer<UUID, Object> producer = createProducer(); 

private static Producer createProducer() {
    Properties props = new Properties();
    props.put(ProducerConfig.BOOTSTRAP_SERVERS_CONFIG,
            "mybootstrapserveraddress");
    props.put(ProducerConfig.CLIENT_ID_CONFIG, "ADAPTER");
    props.put(ProducerConfig.KEY_SERIALIZER_CLASS_CONFIG,
            UUIDSerializer.class);
    props.put(ProducerConfig.VALUE_SERIALIZER_CLASS_CONFIG,
            JsonSerializer.class);
    props.put(ProducerConfig.REQUEST_TIMEOUT_MS_CONFIG,
            1000);
    props.put(ProducerConfig.RETRIES_CONFIG,
            1);
    props.put(ProducerConfig.RETRY_BACKOFF_MS_CONFIG,
            1000);
    return new KafkaProducer<>(props);
}

public void send(Event event, String topic){
    try {
        UUID key = UUID.randomUUID();
        producer.send(new ProducerRecord<>(topic, key , event), (rm, ex) -> {
            if (ex != null) {
                log.warn("Error sending message with key {}\n{}", new Object[]{key, ex.getMessage()});
            } else {
                log.info( "Partition for key-value {} is {}", new Object[]{key, rm.partition()});
            }
        });
    } catch (Exception e) {
        log.error("Failed to send message ",e);
    } finally {
        producer.flush();
    }
}

但是,如果主题不存在,则消息将继续被轮询。 ProducerConfig中的超时和重试将被忽略。

[kafka-producer-network-thread | ADAPTER] WARN org.apache.kafka.clients.NetworkClient - [Producer clientId=ADAPTER] Error while fetching metadata with correlation id 6 : {my-example-topic2=UNKNOWN_TOPIC_OR_PARTITION}
[kafka-producer-network-thread | ADAPTER] WARN org.apache.kafka.clients.NetworkClient - [Producer clientId=ADAPTER] Error while fetching metadata with correlation id 7 : {my-example-topic2=UNKNOWN_TOPIC_OR_PARTITION}
[kafka-producer-network-thread | ADAPTER] WARN org.apache.kafka.clients.NetworkClient - [Producer clientId=ADAPTER] Error while fetching metadata with correlation id 8 : {my-example-topic2=UNKNOWN_TOPIC_OR_PARTITION}

我不想通过AdminClient检查该主题是否存在。 卡夫卡文件https://kafka.apache.org/documentation/#producerconfigs毫无帮助。

是否可以解决此问题?

2 个答案:

答案 0 :(得分:2)

当该主题不存在时,默认情况下会在60秒后结束获取元数据的重试,并在末尾引发超时异常。 与之相关的生产者配置参数为qint8(默认值为60000)。 据我所知,没有什么比减少此超时或使用AdminClient更早获得反馈的了(这是您不希望做的事情)。

答案 1 :(得分:1)

如果发布消息时遇到任何麻烦(在MetadataNotUpdated方法上阻止),Kafka将抛出send异常。可使用max.block.ms来配置超时。但是,请确保未禁用自动创建主题。