我在视频教程中看到,当制作人发布消息时,Kafka Broker支持3种类型的确认。
0 - 火与忘记 1 - 领袖Ack 2 - 所有经纪人的确认
我正在使用Kafka的Java API发布消息。这是必须为每个代理使用特定于每个代理的server.properties设置的东西还是必须由生产者设置的东西?如果必须由生产者设置,请说明如何使用Java API设置它。
import org.apache.kafka.clients.producer.KafkaProducer;
import org.apache.kafka.clients.producer.ProducerRecord;
import org.apache.kafka.clients.producer.RecordMetadata;
import java.util.Properties;
public class KafkaProducerApp {
public static void main(String[] args){
Properties properties = new Properties();
properties.put("bootstrap.servers","localhost:9092,localhost:9093,localhost:9094");
properties.put("key.serializer","org.apache.kafka.common.serialization.StringSerializer");
properties.put("value.serializer","org.apache.kafka.common.serialization.StringSerializer");
KafkaProducer<String,String> kafkaProducer = new KafkaProducer<String, String>(properties);
try{
for(int i=0;i<150;i++) {
RecordMetadata ack = kafkaProducer.send(new ProducerRecord<String, String>("replicated_topic", Integer.toString(i), "MyMessage" + Integer.toString(i))).get();
System.out.println(" Offset = " + ack.offset());
System.out.println(" Partition = " + ack.partition());
}
} catch (Exception ex){
ex.printStackTrace();
} finally {
kafkaProducer.close();
}
}
}
答案 0 :(得分:8)
它是一个生产者属性,设置类似于代码中的其他属性:
properties.put("acks","all");
可以找到所有可配置的生产者属性的列表here。
您可能还想查看与此生产者配置相关的代理(或主题)property min.insync.replicas
。
答案 1 :(得分:5)
我认为您应该了解 acks 属性的实际作用,并了解幕后情况。如果可以的话,您将看到此属性是由生产者配置的。
例如,您一定不会丢失任何消息,例如审核日志。以下代码将如何启动生产者配置:
Properties props = new Properties();
props.put("bootstrap.servers", "localhost:9092,localhost:9093");
props.put("acks", "all"); //We are using acks=all in order to get the strongest guarantee we can.
props.put("retries", "3");
props.put("max.in.flight.requests.per.connection", "5");
这是一个很小但功能强大的更改,它会对邮件是否会到达产生重大影响。
这本来自Kafka In Action本书的图片代表了acks
属性的更多清晰表现: