Kafka 的 Java 生產(chǎn)者是如何管理 TCP 連接的?
為何采用 TCP?
-
Apache Kafka 的所有通信都是基于 TCP 的,而不是基于 HTTP 或其他協(xié)議。
- 在開發(fā)客戶端時(shí),能夠利用 TCP 本身提供的一些高級(jí)功能,比如多路復(fù)用請(qǐng)求以及同時(shí)輪詢多個(gè)連接的能力。
- 除了 TCP 提供的這些高級(jí)功能有可能被 Kafka 客戶端的開發(fā)人員使用之外,目前已知的 HTTP 庫在很多編程語言中都略顯簡(jiǎn)陋。
Kafka 生產(chǎn)者程序概覽
- Kafka 的 Java 生產(chǎn)者 API 主要的對(duì)象就是 KafkaProducer。
- 通常我們開發(fā)一個(gè)生產(chǎn)者的步驟有 4 步。
- 第 1 步:構(gòu)造生產(chǎn)者對(duì)象所需的參數(shù)對(duì)象。
- 第 2 步:利用第 1 步的參數(shù)對(duì)象,創(chuàng)建 KafkaProducer 對(duì)象實(shí)例。
- 第 3 步:使用 KafkaProducer 的 send 方法發(fā)送消息。
- 第 4 步:調(diào)用 KafkaProducer 的 close 方法關(guān)閉生產(chǎn)者并釋放各種系統(tǒng)資源。
Properties props = new Properties (); props.put(“參數(shù)1”, “參數(shù)1的值”); props.put(“參數(shù)2”, “參數(shù)2的值”); …… try (Producer<String, String> producer = new KafkaProducer<>(props)) { producer.send(new ProducerRecord<String, String>(……), callback); …… }
何時(shí)創(chuàng)建 TCP 連接?
- 當(dāng)我們開發(fā)一個(gè) Producer 應(yīng)用時(shí),生產(chǎn)者會(huì)向 Kafka 集群中指定的主題(Topic)發(fā)送消息,這必然涉及與 Kafka Broker 創(chuàng)建 TCP 連接。
- TCP 連接是在創(chuàng)建 KafkaProducer 實(shí)例時(shí)建立的。在創(chuàng)建 KafkaProducer 實(shí)例時(shí),生產(chǎn)者應(yīng)用會(huì)在后臺(tái)創(chuàng)建并啟動(dòng)一個(gè)名為 Sender 的線程,該 Sender 線程開始運(yùn)行時(shí)首先會(huì)創(chuàng)建與 Broker 的連接。
- 理論上,Sender 線程完全能夠觀測(cè)到一個(gè)尚未構(gòu)造完成的 KafkaProducer 實(shí)例。當(dāng)然,在構(gòu)造對(duì)象時(shí)創(chuàng)建線程沒有任何問題,但最好是不要同時(shí)啟動(dòng)它。
- bootstrap.servers 參數(shù)
- 它是 Producer 的核心參數(shù)之一,指定了這個(gè) Producer 啟動(dòng)時(shí)要連接的 Broker 地址。
- 如果你為這個(gè)參數(shù)指定了 1000 個(gè) Broker 連接信息,那么你的 Producer 啟動(dòng)時(shí)會(huì)首先創(chuàng)建與這 1000 個(gè) Broker 的 TCP 連接。
- Producer 一旦連接到集群中的任一臺(tái) Broker,就能拿到整個(gè)集群的 Broker 信息,故沒必要為 bootstrap.servers 指定所有的 Broker。
- TCP 連接還可能在兩個(gè)地方被創(chuàng)建:一個(gè)是在更新元數(shù)據(jù)后,另一個(gè)是在消息發(fā)送時(shí)。
- 當(dāng) Producer 更新了集群的元數(shù)據(jù)信息之后,如果發(fā)現(xiàn)與某些 Broker 當(dāng)前沒有連接,那么它就會(huì)創(chuàng)建一個(gè) TCP 連接。
- 同樣地,當(dāng)要發(fā)送消息時(shí),Producer 發(fā)現(xiàn)尚不存在與目標(biāo) Broker 的連接,也會(huì)創(chuàng)建一個(gè)。
何時(shí)關(guān)閉 TCP 連接?
- Producer 端關(guān)閉 TCP 連接的方式有兩種:一種是用戶主動(dòng)關(guān)閉;?種是 Kafka 自動(dòng)關(guān)閉。
- 第一種主動(dòng)關(guān)閉實(shí)際上是廣義的主動(dòng)關(guān)閉,甚至包括用戶調(diào)用 kill -9 主動(dòng)“殺掉”Producer 應(yīng)用。當(dāng)然最推薦的方式還是調(diào)用 producer.close() 方法來關(guān)閉。
- 第二種是 Kafka 幫你關(guān)閉,這與 Producer 端參數(shù) connections.max.idle.ms 的值有關(guān)。默認(rèn)情況下該參數(shù)值是 9 分鐘,即如果在 9 分鐘內(nèi)沒有任何請(qǐng)求“流過”某個(gè) TCP 連接,那么 Kafka 會(huì)主動(dòng)幫你把該 TCP 連接關(guān)閉。
文章來源地址http://www.zghlxwxcb.cn/news/detail-515843.html
文章來源:http://www.zghlxwxcb.cn/news/detail-515843.html
到了這里,關(guān)于《kafka 核心技術(shù)與實(shí)戰(zhàn)》課程學(xué)習(xí)筆記(十)的文章就介紹完了。如果您還想了解更多內(nèi)容,請(qǐng)?jiān)谟疑辖撬阉鱐OY模板網(wǎng)以前的文章或繼續(xù)瀏覽下面的相關(guān)文章,希望大家以后多多支持TOY模板網(wǎng)!