Kafka系列第4篇:消息發(fā)送背后網(wǎng)絡(luò)操作的那點(diǎn)事兒

?前言

上篇文章講述了消息從生產(chǎn)到寫入到 Broker 的 partition 上背后發(fā)生的故事图仓,并提出了消息發(fā)送的網(wǎng)絡(luò)模型的問題。本篇文章我們來嘗試揭開其背后的神秘面紗猜扮,耐心看完你一定會(huì)有所收獲线罕。

文章概覽

1. Sender 線程的建連準(zhǔn)備階段和發(fā)送網(wǎng)絡(luò)請(qǐng)求兩階段盏档。

2. Selector 選擇器處理網(wǎng)絡(luò)請(qǐng)求過程。


Sender 線程的兩階段

上篇文章結(jié)尾提到了三個(gè)重要的方法把敢,分別是 ready()寄摆、send()、poll()技竟。其中 ready()和 send()可以理解為第一階段冰肴,即建連準(zhǔn)備階段;poll()可以理解為第二階段,即發(fā)送網(wǎng)絡(luò)請(qǐng)求階段熙尉。接下來對(duì)這兩階段做深入研究联逻。

階段流程說明

ready()階段:?遍歷節(jié)點(diǎn)列表,查詢當(dāng)前是否已建立連接检痰,若已完成建連包归,則認(rèn)為該節(jié)點(diǎn)可用;若還未建連铅歼,則判斷該節(jié)點(diǎn)是否可以被連接公壤,若是則建連。對(duì)于不可建連和正在建連的節(jié)點(diǎn)暫時(shí)還不能參與網(wǎng)絡(luò)數(shù)據(jù)傳輸請(qǐng)求椎椰。

send()階段:?通過 ready()階段拿到了已經(jīng)完成建連的節(jié)點(diǎn)厦幅,然后遍歷節(jié)點(diǎn),判斷當(dāng)前節(jié)點(diǎn)是否可以被發(fā)送數(shù)據(jù)慨飘,若可以則將當(dāng)前節(jié)點(diǎn)對(duì)應(yīng)的 RequestChannel 加入到 InFlightRequest 雙端隊(duì)列中去确憨。為什么要將 RequestChannel 加入到一個(gè)雙端隊(duì)列中去呢?因?yàn)榉?wù)端為了保證服務(wù)端性能瓤的,一個(gè)服務(wù)端在同一時(shí)刻只能被一個(gè)客戶端請(qǐng)求連接休弃,如果上一個(gè)客戶端請(qǐng)求還未完成,則不允許新的客戶端請(qǐng)求連接圈膏。當(dāng)客戶端請(qǐng)求接收到服務(wù)端響應(yīng)后塔猾,將對(duì)應(yīng)的客戶端請(qǐng)求從 InFlightRequest 隊(duì)列中移除。

poll()階段:?通過 ready()和 send()兩階段稽坤,完成了數(shù)據(jù)準(zhǔn)備和可用節(jié)點(diǎn)檢查丈甸。在上一篇中我們介紹到客戶端是按照 Broker 分組,每組建立一個(gè)網(wǎng)絡(luò)連接請(qǐng)求尿褪,每個(gè)網(wǎng)絡(luò)連接請(qǐng)求管理多個(gè)網(wǎng)絡(luò)連接通道老虫,從而形成了一個(gè)連接同時(shí)與多個(gè) Broker 進(jìn)行網(wǎng)絡(luò)數(shù)據(jù)傳輸。poll()方法采用了選擇器(Selector)模式來處理這種網(wǎng)絡(luò)模型茫多,其底層是使用 Java 的 NIO 來實(shí)現(xiàn)的。

簡單介紹下 Java NIO 的幾個(gè)組件忽刽,想要深入了解的同學(xué)通過 Google 去了解天揖。

SocketChannel:?客戶端網(wǎng)絡(luò)連接通道,在此通道上可進(jìn)行數(shù)據(jù)的讀寫操作跪帝,比如將數(shù)據(jù)寫入到通道中和將數(shù)據(jù)從通道中讀取出來操作今膊。

Selector:?選擇器,通道是需要注冊(cè)到 Selector 選擇器上的伞剑,同時(shí)在注冊(cè)后會(huì)返回一個(gè)選擇器建斑唬,Selector 會(huì)通過選擇器鍵來監(jiān)聽讀寫事件。

SelectorKey:?選擇器鍵,通道注冊(cè)到選擇器上恕刘,同時(shí)返回了選擇器鍵缤谎,從而使得選擇器鍵和通道建立了關(guān)系。

以上三者之間的關(guān)系如下:

當(dāng)有讀寫請(qǐng)求發(fā)生時(shí)褐着,Selector 可以通過 SelectorKey 拿到對(duì)應(yīng)的 SocketChannel坷澡,從而在 SocketChannel 上進(jìn)行數(shù)據(jù)的讀寫請(qǐng)求。


Selector 選擇器的實(shí)現(xiàn)原理

關(guān)于 Selector 選擇器含蓉,我們從兩個(gè)方面來介紹其背后發(fā)生了那些故事频敛,分別是 建連過程和讀寫操作流程。

Selector 建連過程分析

Kafka建連過程

從上圖可以看出馅扣,首先打開一個(gè)客戶端連接 SocketChannel斟赚,然后對(duì) Socket 設(shè)置一些參數(shù),比如寫入數(shù)據(jù)大小差油、接受數(shù)據(jù)大小拗军、TCP 延遲等等參數(shù)。然后使用 SocketChannel 嘗試建立連接厌殉。建連完成后將 SocketChannel 注冊(cè)到 Selector 選擇器上食绿,并返回 SelectorKey。最后將 SocketChannel 包裝成 KafkaChannel公罕,并使用 SelectorKey 與 KafkaChannel 進(jìn)行關(guān)聯(lián)器紧;為啥會(huì)出現(xiàn) KafkaChannel 了呢?因?yàn)?Kafka 框架為了屏蔽 SocketChannel 內(nèi)部的細(xì)節(jié)操作楼眷,所有就對(duì) SocketChannel 進(jìn)行了一層包裝方便 Kafka 客戶端操作铲汪。

附上源碼供大家參考研究

Selector 選擇器讀寫操作流程

讀寫流程圖

從上圖可以看出,以寫操作為例罐柳,客戶端輪詢到寫請(qǐng)求時(shí)掌腰,首先獲取寫請(qǐng)求對(duì)應(yīng)的 SelectorKey,從而拿到對(duì)應(yīng)的 KafkaChannel张吉;然后將要發(fā)送的數(shù)據(jù)寫入到 KafkaChannel 中齿梁;然后通過傳輸協(xié)議將數(shù)據(jù)交由底層的 SocketChannel;最后由 SocketChannel 將數(shù)據(jù)發(fā)送給 Broker肮蛹,完成數(shù)據(jù)的發(fā)送請(qǐng)求勺择。該過程中需要注意一個(gè)問題,Broker 在同一時(shí)間只能處理一個(gè)客戶端請(qǐng)求伦忠,如果當(dāng)前客戶端請(qǐng)求還沒被被處理完省核,下一個(gè)請(qǐng)求是不能被發(fā)送給服務(wù)端的。


總結(jié)

以上即為數(shù)據(jù)從客戶端發(fā)送到服務(wù)端背后相關(guān)的網(wǎng)絡(luò)操作故事昆码;到此气忠,關(guān)于生產(chǎn)者客戶端的相關(guān)操作暫且分析到這里邻储,關(guān)于客戶端冪等性、消息重發(fā)等問題我們?cè)诤竺鎸iT用篇幅來講解旧噪。下篇文章我們來分析一下消費(fèi)者端消費(fèi)消息背后的一些故事吨娜,敬請(qǐng)期待。

微信搜索公眾號(hào)【z小趙】舌菜,更多系列精彩文章等你解鎖

微信公眾號(hào)搜索【z小趙】
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請(qǐng)聯(lián)系作者
  • 序言:七十年代末萌壳,一起剝皮案震驚了整個(gè)濱河市,隨后出現(xiàn)的幾起案子日月,更是在濱河造成了極大的恐慌袱瓮,老刑警劉巖,帶你破解...
    沈念sama閱讀 219,039評(píng)論 6 508
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件爱咬,死亡現(xiàn)場離奇詭異尺借,居然都是意外死亡,警方通過查閱死者的電腦和手機(jī)精拟,發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 93,426評(píng)論 3 395
  • 文/潘曉璐 我一進(jìn)店門燎斩,熙熙樓的掌柜王于貴愁眉苦臉地迎上來,“玉大人蜂绎,你說我怎么就攤上這事栅表。” “怎么了师枣?”我有些...
    開封第一講書人閱讀 165,417評(píng)論 0 356
  • 文/不壞的土叔 我叫張陵怪瓶,是天一觀的道長。 經(jīng)常有香客問我践美,道長洗贰,這世上最難降的妖魔是什么? 我笑而不...
    開封第一講書人閱讀 58,868評(píng)論 1 295
  • 正文 為了忘掉前任陨倡,我火速辦了婚禮敛滋,結(jié)果婚禮上,老公的妹妹穿的比我還像新娘兴革。我一直安慰自己绎晃,他們只是感情好,可當(dāng)我...
    茶點(diǎn)故事閱讀 67,892評(píng)論 6 392
  • 文/花漫 我一把揭開白布杂曲。 她就那樣靜靜地躺著箕昭,像睡著了一般。 火紅的嫁衣襯著肌膚如雪解阅。 梳的紋絲不亂的頭發(fā)上,一...
    開封第一講書人閱讀 51,692評(píng)論 1 305
  • 那天泌霍,我揣著相機(jī)與錄音货抄,去河邊找鬼述召。 笑死,一個(gè)胖子當(dāng)著我的面吹牛蟹地,可吹牛的內(nèi)容都是我干的积暖。 我是一名探鬼主播,決...
    沈念sama閱讀 40,416評(píng)論 3 419
  • 文/蒼蘭香墨 我猛地睜開眼怪与,長吁一口氣:“原來是場噩夢(mèng)啊……” “哼夺刑!你這毒婦竟也來了?” 一聲冷哼從身側(cè)響起分别,我...
    開封第一講書人閱讀 39,326評(píng)論 0 276
  • 序言:老撾萬榮一對(duì)情侶失蹤遍愿,失蹤者是張志新(化名)和其女友劉穎,沒想到半個(gè)月后耘斩,有當(dāng)?shù)厝嗽跇淞掷锇l(fā)現(xiàn)了一具尸體沼填,經(jīng)...
    沈念sama閱讀 45,782評(píng)論 1 316
  • 正文 獨(dú)居荒郊野嶺守林人離奇死亡,尸身上長有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點(diǎn)故事閱讀 37,957評(píng)論 3 337
  • 正文 我和宋清朗相戀三年括授,在試婚紗的時(shí)候發(fā)現(xiàn)自己被綠了坞笙。 大學(xué)時(shí)的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片。...
    茶點(diǎn)故事閱讀 40,102評(píng)論 1 350
  • 序言:一個(gè)原本活蹦亂跳的男人離奇死亡荚虚,死狀恐怖薛夜,靈堂內(nèi)的尸體忽然破棺而出,到底是詐尸還是另有隱情版述,我是刑警寧澤梯澜,帶...
    沈念sama閱讀 35,790評(píng)論 5 346
  • 正文 年R本政府宣布,位于F島的核電站院水,受9級(jí)特大地震影響腊徙,放射性物質(zhì)發(fā)生泄漏。R本人自食惡果不足惜檬某,卻給世界環(huán)境...
    茶點(diǎn)故事閱讀 41,442評(píng)論 3 331
  • 文/蒙蒙 一撬腾、第九天 我趴在偏房一處隱蔽的房頂上張望。 院中可真熱鬧恢恼,春花似錦民傻、人聲如沸。這莊子的主人今日做“春日...
    開封第一講書人閱讀 31,996評(píng)論 0 22
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽。三九已至漏隐,卻和暖如春喧半,著一層夾襖步出監(jiān)牢的瞬間,已是汗流浹背青责。 一陣腳步聲響...
    開封第一講書人閱讀 33,113評(píng)論 1 272
  • 我被黑心中介騙來泰國打工挺据, 沒想到剛下飛機(jī)就差點(diǎn)兒被人妖公主榨干…… 1. 我叫王不留取具,地道東北人。 一個(gè)月前我還...
    沈念sama閱讀 48,332評(píng)論 3 373
  • 正文 我出身青樓扁耐,卻偏偏與公主長得像暇检,于是被迫代替她去往敵國和親。 傳聞我的和親對(duì)象是個(gè)殘疾皇子婉称,可洞房花燭夜當(dāng)晚...
    茶點(diǎn)故事閱讀 45,044評(píng)論 2 355