在服务器上使用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个节点关闭时,控制台生产者也不会失败。
答案 0 :(得分:0)
props.put("min.insync.replicas","2");
这是主题和/或经纪人财产,而不是生产者财产。