溫馨提示×

溫馨提示×

您好,登錄后才能下訂單哦!

密碼登錄×
登錄注冊×
其他方式登錄
點擊 登錄注冊 即表示同意《億速云用戶服務(wù)條款》

Kafka的面試題有哪些

發(fā)布時間:2022-01-15 16:15:19 來源:億速云 閱讀:132 作者:iii 欄目:大數(shù)據(jù)

本篇內(nèi)容主要講解“Kafka的面試題有哪些”,感興趣的朋友不妨來看看。本文介紹的方法操作簡單快捷,實用性強。下面就讓小編來帶大家學(xué)習(xí)“Kafka的面試題有哪些”吧!

1. RangeAssignor和RoundRobinAssignor的區(qū)別,感覺沒有區(qū)別

答:區(qū)別:

按照范圍來分配:

對所有消費者按照字典序排序,每個主題中的分區(qū)數(shù)值序排序。

對主題的各個分區(qū)分堆,每個消費者分配一堆。

基于主題的;

一個主題的情況下,將主題的分區(qū)分配到消費組的各個消費者:

保證消費者分配的分區(qū)數(shù)差值最大為1

Kafka的面試題有哪些

如果消費組訂閱了兩個主題,則按照區(qū)域,依次對每個主題的分區(qū)進行分配:

會導(dǎo)致消費組中不同消費者分配到的分區(qū)數(shù)差值<font >大于1</font>

Kafka的面試題有哪些

輪詢的方式列出所有訂閱的主題分區(qū),列出所有的消費者線程

對主題分區(qū)排序,對消費者排序。

不同消費者分配的分區(qū)數(shù),最多多一個,消費者分配的分區(qū)數(shù)最大差值也就是1而已。

Kafka的面試題有哪些

消費組訂閱多個分區(qū)的時候:

Kafka的面試題有哪些

2 生產(chǎn)消息的時候,重試次數(shù)到了還失敗,緩沖區(qū)的那條數(shù)據(jù)會清掉了吧?是不是要靠客戶端捕獲異常存下那個消息?

答:是的,需要客戶端處理,但是不用捕獲異常,直接判斷即可。

下面是Sender線程發(fā)送消息,處理消息重試主要邏輯的源碼展示:

Sender線程:

負責(zé)從消息累加器獲取消息,并發(fā)送:

Kafka的面試題有哪些

run方法的實現(xiàn):

Kafka的面試題有哪些

上圖中的方法最后,發(fā)送消息:

Kafka的面試題有哪些

sendProducerData的實現(xiàn):

Kafka的面試題有哪些

上圖中的方法最后,調(diào)用sendProduceRequests方法發(fā)送消息:

Kafka的面試題有哪些

Kafka的面試題有哪些

上圖中sendProduceRequest方法的實現(xiàn):(注意,此時是單數(shù)形式,不是復(fù)數(shù)形式,也就是說該方法發(fā)送單一消息批。)

Kafka的面試題有哪些

上圖中的方法最后,創(chuàng)建請求對象,發(fā)送請求:

Kafka的面試題有哪些

callback的handleProduceResponse方法實現(xiàn):

Kafka的面試題有哪些

completeBatch方法實現(xiàn):

Kafka的面試題有哪些

如果消息批在發(fā)送的時候出現(xiàn)錯誤,則先判斷是否可以重試,如果可以重試,就將消息批重新入列,等待重新發(fā)送:

Kafka的面試題有哪些

上圖中的canRetry實現(xiàn):

判斷當前消息批是否可以重試,如果可以重試,就需要重試:

Kafka的面試題有哪些

將消息批重新入列:

Kafka的面試題有哪些

將需要重試的消息批重新入列以待重試:

Kafka的面試題有哪些

completeBatch方法中,如果重試次數(shù)耗盡,則執(zhí)行以下代碼:

Kafka的面試題有哪些)

failBatch的實現(xiàn):

Kafka的面試題有哪些

上圖中調(diào)用的方法:

Kafka的面試題有哪些

上圖中的方法中最后,從累加器中釋放該失敗的消息批。 Kafka的面試題有哪些

問題在于:如果我們發(fā)送的消息,重試次數(shù)耗盡了,我如何知道是哪個消息發(fā)送失???

如果我想將該失敗的消息放到其他的地方,比如進行手動補償,如何獲取該失敗的消息?

Kafka的面試題有哪些

3. dome1 啟動不了,需要配置advertised.listeners 才能啟動 是什么原因

名稱說明類型默認值重要程度
advertised.listeners如果供客戶端使用的監(jiān)聽器地址不同于listeners配置的值,需要使用該屬性將監(jiān)聽器注冊到zookeeper上。在IaaS環(huán)境下,該值一般與broker綁定的地址不同。如果不設(shè)置的話,使用listeners的值。跟listeners不同的是該地址不允許指定到0.0.0.0。stringnullhigh
listeners逗號分隔的<font color=red>監(jiān)聽器地址</font>和<font color=blue>監(jiān)聽器名稱</font>列表。如果監(jiān)聽器使用的不是安全協(xié)議,需要同時設(shè)置listener.security.protocol.map的值。將hostname設(shè)置為0.0.0.0會綁定到所有網(wǎng)絡(luò)接口。如果不設(shè)置hostname就綁定到默認的網(wǎng)絡(luò)接口。示例:PLAINTEXT://myhost:9092,SSL://:9091<br />CLIENT://0.0.0.0:9092,REPLICATION://localhost:9093stringnullhigh
inter.broker.listener.namebroker之間通信使用的監(jiān)聽器名稱。如果該屬性不設(shè)置,則使用security.inter.broker.protocol設(shè)置的值。不要和security.inter.broker.protocol屬性一起使用。stringnullmedium
security.inter.broker.protocolbroker之間通信使用的安全協(xié)議。選項包括:PLAINTEXT, SSL, SASL_PLAINTEXT, SASL_SSL。不要與inter.broker.listener.name屬性一起配置使用。stringPLAINTEXTmedium
listener.security.protocol.map<font >監(jiān)聽器名稱</font>和<font >安全協(xié)議</font>的映射關(guān)系。當多個端口或IP地址使用同一個安全協(xié)議的時候,必須配置。例如:內(nèi)部和外部通信可以使用本配置隔離開,即使在它們都使用SSL。具體來說,用戶可以定義監(jiān)聽器名稱為INTERNAL和EXTERNAL的監(jiān)聽器,此時該屬性的配置為:INTERNAL:SSL,EXTERNAL:SSL。鍵和值使用冒號隔開,鍵值對使用逗號隔開。每個監(jiān)聽器名稱在配置中只能出現(xiàn)一次。不同安全協(xié)議(SSL和SASL)的配置,可以對每個監(jiān)聽器添加一個歸一化的前綴(監(jiān)聽器名稱小寫)來配置。例如:要為INTERNAL監(jiān)聽器配置不同的keystore,則名字為:<br />listener.name.internal.ssl.keystore.location 如果沒有配置監(jiān)聽器的名稱,配置就使用通用的配置,如ssl.keystore.locationstringPLAINTEXT:PLAINTEXT,<br />SSL:SSL,<br />SASL_PLAINTEXT:SASL_PLAINTEXT,<br />SASL_SSL:SASL_SSLlow

配置虛擬機兩個IP地址:

Kafka的面試題有哪些

kafka的server.properties的配置:

默認配置:

Kafka的面試題有哪些

使用PLAINTEXT://:9092,在所有網(wǎng)絡(luò)接口發(fā)布服務(wù)。

zookeeper的信息: Kafka的面試題有哪些

默認配置下,106和116兩個IP地址都可以使用:

public class MyProducer {

    public static void main(String[] args) throws ExecutionException, InterruptedException {
        Map<String, Object> configs = new HashMap<>();
//        configs.put(ProducerConfig.BOOTSTRAP_SERVERS_CONFIG, "192.168.100.106:9092");
        configs.put(ProducerConfig.BOOTSTRAP_SERVERS_CONFIG, "192.168.100.116:9092");
        configs.put(ProducerConfig.KEY_SERIALIZER_CLASS_CONFIG, StringSerializer.class);
        configs.put(ProducerConfig.VALUE_SERIALIZER_CLASS_CONFIG, StringSerializer.class);

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

        RecordMetadata metadata = producer.send(
                new ProducerRecord<String, String>("tp_demo_01", "hello lagou 106-1")
        ).get();

        System.out.println(metadata.topic() + "\t" + metadata.partition() + "\t" + metadata.offset());

        producer.close();

    }
}

如果服務(wù)器有兩個IP地址,一個是內(nèi)網(wǎng),另一個是外網(wǎng),如何配置,讓broker之間通信走內(nèi)網(wǎng)IP地址,而將外網(wǎng)地址供外網(wǎng)客戶端使用?

首先需要配置兩個listener:

listeners=PLAINTEXT://192.168.100.106:9092,PLAINTEXT://192.168.100.116:9093
advertised.listeners=PLAINTEXT://192.168.100.116:9093

報錯:因為listeners中的PLAINTEXT是監(jiān)聽器的名字。

如果兩個監(jiān)聽器,它們的名字不能一樣,所以改進配置:

listeners=PLAINTEXT://192.168.100.106:9092,MYCLIENT://192.168.100.116:9093
advertised.listeners=MYCLIENT://192.168.100.116:9093

報錯:因為沒有給MYCLIENT名字的監(jiān)聽器配置安全協(xié)議。

listeners=PLAINTEXT://192.168.100.106:9092,MYCLIENT://192.168.100.116:9093
advertised.listeners=MYCLIENT://192.168.100.116:9093
listener.security.protocol.map=MYCLIENT:PLAINTEXT,PLAINTEXT:PLAINTEXT
inter.broker.listener.name=MYCLIENT

zk結(jié)果:

Kafka的面試題有哪些

此時使用代碼訪問:

192.168.100.116:9093可以訪問,192.168.100.106:9092不能訪問。

則192.168.100.116:9093暴露給客戶端使用了。

終極配置:

listeners=PLAINTEXT://192.168.100.106:9092,MYCLIENT://192.168.100.116:9093
advertised.listeners=PLAINTEXT://192.168.100.106:9092,MYCLIENT://192.168.100.116:9093
listener.security.protocol.map=MYCLIENT:PLAINTEXT,PLAINTEXT:PLAINTEXT
inter.broker.listener.name=PLAINTEXT
  1. 一個服務(wù)器上有兩個IP地址,一個是內(nèi)網(wǎng)地址,另一個是外網(wǎng)地址。

  2. advertised.listeners用于指定要發(fā)布到zookeeper上供客戶端使用的監(jiān)聽器。

  3. 使用listeners讓kafka啟動的時候,使用指定的協(xié)議監(jiān)聽指定的IP地址和端口。

  4. 同時指定broker之間通信使用的監(jiān)聽器名稱,該監(jiān)聽器使用內(nèi)網(wǎng)IP地址。

  5. advertised.listeners中的另一個供客戶端使用。

到此,相信大家對“Kafka的面試題有哪些”有了更深的了解,不妨來實際操作一番吧!這里是億速云網(wǎng)站,更多相關(guān)內(nèi)容可以進入相關(guān)頻道進行查詢,關(guān)注我們,繼續(xù)學(xué)習(xí)!

向AI問一下細節(jié)

免責(zé)聲明:本站發(fā)布的內(nèi)容(圖片、視頻和文字)以原創(chuàng)、轉(zhuǎn)載和分享為主,文章觀點不代表本網(wǎng)站立場,如果涉及侵權(quán)請聯(lián)系站長郵箱:is@yisu.com進行舉報,并提供相關(guān)證據(jù),一經(jīng)查實,將立刻刪除涉嫌侵權(quán)內(nèi)容。

AI