您好,登錄后才能下訂單哦!
本篇內(nèi)容主要講解“Kafka的面試題有哪些”,感興趣的朋友不妨來看看。本文介紹的方法操作簡單快捷,實用性強。下面就讓小編來帶大家學(xué)習(xí)“Kafka的面試題有哪些”吧!
答:區(qū)別:
按照范圍來分配:
對所有消費者按照字典序排序,每個主題中的分區(qū)數(shù)值序排序。
對主題的各個分區(qū)分堆,每個消費者分配一堆。
基于主題的;
一個主題的情況下,將主題的分區(qū)分配到消費組的各個消費者:
保證消費者分配的分區(qū)數(shù)差值最大為1
如果消費組訂閱了兩個主題,則按照區(qū)域,依次對每個主題的分區(qū)進行分配:
會導(dǎo)致消費組中不同消費者分配到的分區(qū)數(shù)差值<font >大于1</font>
輪詢的方式列出所有訂閱的主題分區(qū),列出所有的消費者線程
對主題分區(qū)排序,對消費者排序。
不同消費者分配的分區(qū)數(shù),最多多一個,消費者分配的分區(qū)數(shù)最大差值也就是1而已。
消費組訂閱多個分區(qū)的時候:
答:是的,需要客戶端處理,但是不用捕獲異常,直接判斷即可。
下面是Sender線程發(fā)送消息,處理消息重試主要邏輯的源碼展示:
Sender線程:
負責(zé)從消息累加器獲取消息,并發(fā)送:
run方法的實現(xiàn):
上圖中的方法最后,發(fā)送消息:
sendProducerData的實現(xiàn):
上圖中的方法最后,調(diào)用sendProduceRequests方法發(fā)送消息:
上圖中sendProduceRequest方法的實現(xiàn):(注意,此時是單數(shù)形式,不是復(fù)數(shù)形式,也就是說該方法發(fā)送單一消息批。)
上圖中的方法最后,創(chuàng)建請求對象,發(fā)送請求:
callback的handleProduceResponse方法實現(xiàn):
completeBatch方法實現(xiàn):
如果消息批在發(fā)送的時候出現(xiàn)錯誤,則先判斷是否可以重試,如果可以重試,就將消息批重新入列,等待重新發(fā)送:
上圖中的canRetry實現(xiàn):
判斷當前消息批是否可以重試,如果可以重試,就需要重試:
將消息批重新入列:
將需要重試的消息批重新入列以待重試:
completeBatch方法中,如果重試次數(shù)耗盡,則執(zhí)行以下代碼:
)
failBatch的實現(xiàn):
上圖中調(diào)用的方法:
上圖中的方法中最后,從累加器中釋放該失敗的消息批。
問題在于:如果我們發(fā)送的消息,重試次數(shù)耗盡了,我如何知道是哪個消息發(fā)送失???
如果我想將該失敗的消息放到其他的地方,比如進行手動補償,如何獲取該失敗的消息?
名稱 | 說明 | 類型 | 默認值 | 重要程度 |
---|---|---|---|---|
advertised.listeners | 如果供客戶端使用的監(jiān)聽器地址不同于listeners配置的值,需要使用該屬性將監(jiān)聽器注冊到zookeeper上。在IaaS環(huán)境下,該值一般與broker綁定的地址不同。如果不設(shè)置的話,使用listeners 的值。跟listeners 不同的是該地址不允許指定到0.0.0.0。 | string | null | high |
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:9093 | string | null | high |
inter.broker.listener.name | broker之間通信使用的監(jiān)聽器名稱。如果該屬性不設(shè)置,則使用security.inter.broker.protocol設(shè)置的值。不要和security.inter.broker.protocol屬性一起使用。 | string | null | medium |
security.inter.broker.protocol | broker之間通信使用的安全協(xié)議。選項包括:PLAINTEXT, SSL, SASL_PLAINTEXT, SASL_SSL。不要與inter.broker.listener.name屬性一起配置使用。 | string | PLAINTEXT | medium |
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.location 。 | string | PLAINTEXT:PLAINTEXT,<br />SSL:SSL,<br />SASL_PLAINTEXT:SASL_PLAINTEXT,<br />SASL_SSL:SASL_SSL | low |
配置虛擬機兩個IP地址:
kafka的server.properties的配置:
默認配置:
使用PLAINTEXT://:9092,在所有網(wǎng)絡(luò)接口發(fā)布服務(wù)。
zookeeper的信息:
默認配置下,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é)果:
此時使用代碼訪問:
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
一個服務(wù)器上有兩個IP地址,一個是內(nèi)網(wǎng)地址,另一個是外網(wǎng)地址。
advertised.listeners
用于指定要發(fā)布到zookeeper上供客戶端使用的監(jiān)聽器。
使用listeners讓kafka啟動的時候,使用指定的協(xié)議監(jiān)聽指定的IP地址和端口。
同時指定broker之間通信使用的監(jiān)聽器名稱,該監(jiān)聽器使用內(nèi)網(wǎng)IP地址。
advertised.listeners
中的另一個供客戶端使用。
到此,相信大家對“Kafka的面試題有哪些”有了更深的了解,不妨來實際操作一番吧!這里是億速云網(wǎng)站,更多相關(guān)內(nèi)容可以進入相關(guān)頻道進行查詢,關(guān)注我們,繼續(xù)學(xué)習(xí)!
免責(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)容。