全國(guó)咨詢(xún)/投訴熱線:400-618-4000

首頁(yè)常見(jiàn)問(wèn)題正文

kafka的ack的三種機(jī)制是什么?

更新時(shí)間:2023-10-18 來(lái)源:黑馬程序員 瀏覽量:

  Kafka的ACK機(jī)制是指生產(chǎn)者發(fā)送消息到Kafka代理并接收確認(rèn)的方式。ACK機(jī)制有三種不同級(jí)別,用于控制生產(chǎn)者在消息發(fā)送后接收確認(rèn)時(shí)的可靠性。這些級(jí)別分別是:

  1.acks=0:

  這是最不可靠的模式。生產(chǎn)者在發(fā)送消息后不會(huì)等待來(lái)自服務(wù)器的確認(rèn)。這意味著消息可能會(huì)在發(fā)送之后丟失,而生產(chǎn)者將無(wú)法知道它是否成功到達(dá)服務(wù)器。

  2.acks=1:

  這是默認(rèn)模式,也是一種折衷方式。在這種模式下,生產(chǎn)者會(huì)在消息發(fā)送后等待來(lái)自分區(qū)領(lǐng)導(dǎo)者(leader)的確認(rèn),但不會(huì)等待所有副本(replicas)的確認(rèn)。這意味著只要消息被寫(xiě)入分區(qū)領(lǐng)導(dǎo)者,生產(chǎn)者就會(huì)收到確認(rèn)。如果分區(qū)領(lǐng)導(dǎo)者成功寫(xiě)入消息,但在同步到所有副本之前宕機(jī),消息可能會(huì)丟失。

  3.acks=all:

  這是最可靠的模式。在這種模式下,生產(chǎn)者會(huì)在消息發(fā)送后等待所有副本的確認(rèn)。只有在所有副本都成功寫(xiě)入消息后,生產(chǎn)者才會(huì)收到確認(rèn)。這確保了消息的可靠性,但會(huì)導(dǎo)致更長(zhǎng)的延遲。

1697593064481_kafka的ack三種機(jī)制是什么.jpg

  下面是使用Java語(yǔ)言演示如何配置不同的ACK機(jī)制:

import org.apache.kafka.clients.producer.*;
import java.util.Properties;

public class KafkaProducerDemo {
    public static void main(String[] args) {
        Properties props = new Properties();
        props.put("bootstrap.servers", "localhost:9092");
        props.put("key.serializer", "org.apache.kafka.common.serialization.StringSerializer");
        props.put("value.serializer", "org.apache.kafka.common.serialization.StringSerializer");

        // 配置 ACKs
        // acks=0:不等待確認(rèn)
        // acks=1:等待分區(qū)領(lǐng)導(dǎo)者確認(rèn)
        // acks=all:等待所有副本確認(rèn)
        props.put("acks", "all");

        KafkaProducer<String, String> producer = new KafkaProducer<>(props);

        ProducerRecord<String, String> record = new ProducerRecord<>("my-topic", "key", "value");

        producer.send(record, new Callback() {
            @Override
            public void onCompletion(RecordMetadata metadata, Exception exception) {
                if (exception == null) {
                    System.out.println("消息發(fā)送成功,偏移量:" + metadata.offset());
                } else {
                    System.err.println("消息發(fā)送失敗: " + exception.getMessage());
                }
            }
        });

        producer.close();
    }
}

  在上面的示例中,我們配置了ACKs為 "all",這意味著生產(chǎn)者將等待所有副本的確認(rèn),以確保消息的可靠性。根據(jù)實(shí)際需求,我們可以將acks的值設(shè)置為"0"或"1"以實(shí)現(xiàn)不同級(jí)別的可靠性。

分享到:
在線咨詢(xún) 我要報(bào)名
和我們?cè)诰€交談!