即使3个节点中只有1个出现故障,Kafka生产者仍会继续生成消息

时间:2019-07-01 18:59:45

标签: java apache-kafka

在服务器上使用kafka版本1.1.0,并在生产者客户端中使用相同的spring依赖项:

等级依赖性: 实施组:“ org.apache.kafka”,名称:“ kafka_2.11”,版本:“ 1.1.0”

我创建了一个具有复制因子3和单个分区的主题。服务器端有3个节点的kafka集群。当所有节点都启动时,生产者可以正常发送消息。当单个节点出现故障时,生产者可以正常工作。当第二个节点(3个节点中的一个)发生故障时,我期望生产者在超过RF-1个节点发生故障时立即抛出异常。在这种情况下,它将有2个节点。

这是我的Java生产者代码。

生产者配置:

Properties props = new Properties();
props.put("bootstrap.servers","host1:9092,host2:9092,host3:9092); 
props.put("min.insync.replicas","2");
props.put("default.replication.factor","3");
props.put("acks","all");
props.put("retries","1");
props.put("batch.size","16384");
props.put("linger.ms","1");
props.put("buffer.memory","33554432");
props.put("key.serializer","org.apache.kafka.common.serialization.StringSerializer");
props.put("value.serializer","org.apache.kafka.common.serialization.StringSerializer");
props.put("num.partitions","1");

发件人代码:

String data = "some data";
String topic = "testTopic";
try {
    ProducerRecord<String, String> producerRecord = new ProducerRecord<String, String>(
            topic, data);

    RecordMetadata m = producer.send(producerRecord).get(); // Publish message to topic

    logger.info("Message application id: {} ", appId);
    logger.info("Message produced, offset: " + m.offset());
    logger.info("Message produced, partition : " + m.partition());
    logger.info("Message produced, topic: " + m.topic());
    logger.info("Data sent to topic: {} ", topic);
}catch (Exception e) { 
    logger.error("Error:\n", e); 
    producer.close();
}

使用上述配置和代码,生产者只能在一个节点向上的情况下发送消息。我试图通过使用控制台生产者“ kafka-console-producer.sh”来缩小问题的范围,并且观察到了相同的行为。当2个节点关闭时,控制台生产者也不会失败。

1 个答案:

答案 0 :(得分:0)

  

props.put("min.insync.replicas","2");

这是主题和/或经纪人财产,而不是生产者财产。