Kafka的客戶和服務(wù)端模型

Kafka是一個優(yōu)秀的分布式消息隊列着憨,以高并發(fā)和高性能著稱柒爵,我們以簡單全面的視角剖析一下Kafka框架的設(shè)計。

作為一個分布式消息隊列一般有三個角色

  • 服務(wù)端 即broker抄腔,負責消息的存儲楞抡,消費伟众,分區(qū)等管理
  • 生產(chǎn)者 對于服務(wù)端來說也是一個客戶端,用于將消息發(fā)送到服務(wù)端
  • 消費者 用于消費生產(chǎn)者生產(chǎn)的消息
服務(wù)端

服務(wù)端的架構(gòu)和Netty有些類似召廷,其實完全可以使用Netty實現(xiàn)凳厢,可能是考慮到框架的依賴以及包管理的原因,Kafka實現(xiàn)了一個迷你版本的Netty竞慢,對于Netty知道它使用了Reator模式實現(xiàn)先紫,所以kafka的服務(wù)端實現(xiàn)也不例外,下面我們來列舉一下關(guān)鍵的一些類:

  • SocketServer 從名字我們可以知道它是服務(wù)端管理的核心類筹煮,用于管理服務(wù)端的連接遮精,消息的消費請求以及請求的響應(yīng)等,和Netty一樣里面有接待線程和工作線程寺谤,只不過將工作線程劃分得更具體仑鸥,分為同步集群消息的控制線程和接受處理生產(chǎn)和消費消息的數(shù)據(jù)線程。
  • KafkaRequestHandler 這個才是真正的工作線程变屁,也就是實質(zhì)性干活的對象眼俊,SocketServer的Processer線程其實只是將請求緩存到RequestChannel,KafkaRequestHandler就是從RequestChannel的請求隊列里面獲取請求進行實質(zhì)的請求處理粟关,其實KafkaRequestHandler是將請求又交給了KafkaApis這個類處理疮胖,我們以發(fā)送請求為例描述一下過程:
    首先請求過來將消息由Acceptor交給Processer處理,Processer將請求交給KafkaRequestHandler闷板,KafkaRequestHandler又將響應(yīng)消息交給Processer發(fā)送給客戶端澎灸,有沒有發(fā)現(xiàn)這個過程就像一個傳遞游戲,為什么Processer不直接將活干了遮晚,反而又KafkaRequestHandler處理事務(wù)呢性昭?原因就是拉長戰(zhàn)線,人多好干活县遣,KafkaRequestHandler就像一個蓄水池的容器將所有請求穩(wěn)在自己的池子里面滿滿處理糜颠,而Processer負責響應(yīng)請求就好了,這樣減輕Processer的很多負擔萧求,從而系統(tǒng)的吞吐量其兴。
生產(chǎn)者

生產(chǎn)者主要有以下幾個關(guān)鍵部件組成:
KafkaProducer 這個是生產(chǎn)者的主要類,用于供客戶端發(fā)布消息使用夸政,生產(chǎn)者發(fā)布消息必須要知道消息發(fā)布到哪里元旬,所以其依賴于元數(shù)據(jù)管理類ProducerMetadata,同時生產(chǎn)者發(fā)布消息不是馬上發(fā)布守问,需要把消息緩存到一個地方匀归,使用得是RecordAccumulator這個消息累加器,同時它還有自己的管家Sender酪碘,Sender使用NetworkClient進行消息發(fā)送朋譬,Sender又使用SendBuilder進行消息緩存,SendBuilder使用ByteBuffer進行消息的存儲兴垦,最終將消息緩存到KafkaChannel的send字段徙赢,NetworkClient又在poll方法使用Selector發(fā)送消息,最終真正的發(fā)送是在Selector的pollSelectionKeys方法完成探越,最終調(diào)用NetworkSend的writeTo方法狡赐,入?yún)⑹荰ransferableChannel,這個參數(shù)從哪里來钦幔?其實來自于Selector的connect方法枕屉,它是一個java NIO的SocketChannel類,NetworkSend的writeTo方法的send其實是ByteBufferSend鲤氢,它來自于SendBuilder的build方法構(gòu)建搀擂,調(diào)用flushPendingSend構(gòu)造產(chǎn)生西潘,代碼如下:


    private void flushPendingSend() {
        flushPendingBuffer();
        if (!buffers.isEmpty()) {
            ByteBuffer[] byteBufferArray = buffers.toArray(new ByteBuffer[0]);
            addSend(new ByteBufferSend(byteBufferArray, sizeOfBuffers));
            clearBuffers();
        }
    }
消費者

消費者的核心線程是KafkaConsumer,其核心方法是subscribe和poll哨颂,subscribe主要是用來進行主題訂閱喷市,里面有分區(qū)重平衡邏輯,poll方法借助于其核心組件Fetcher分區(qū)消息的拉取威恼,它的輔助組件是ConsumerNetworkClient品姓,其本質(zhì)還是NetworkClient的poll完成實質(zhì)的消息拉取,對于消費者過程相對比較簡單箫措,拉取的消息最終是緩存到Fetcher組件供KafkaConsumer使用腹备。

最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請聯(lián)系作者
  • 序言:七十年代末,一起剝皮案震驚了整個濱河市斤蔓,隨后出現(xiàn)的幾起案子植酥,更是在濱河造成了極大的恐慌,老刑警劉巖附迷,帶你破解...
    沈念sama閱讀 206,723評論 6 481
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件惧互,死亡現(xiàn)場離奇詭異,居然都是意外死亡喇伯,警方通過查閱死者的電腦和手機喊儡,發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 88,485評論 2 382
  • 文/潘曉璐 我一進店門,熙熙樓的掌柜王于貴愁眉苦臉地迎上來稻据,“玉大人艾猜,你說我怎么就攤上這事∧砻酰” “怎么了匆赃?”我有些...
    開封第一講書人閱讀 152,998評論 0 344
  • 文/不壞的土叔 我叫張陵,是天一觀的道長今缚。 經(jīng)常有香客問我算柳,道長,這世上最難降的妖魔是什么姓言? 我笑而不...
    開封第一講書人閱讀 55,323評論 1 279
  • 正文 為了忘掉前任瞬项,我火速辦了婚禮,結(jié)果婚禮上何荚,老公的妹妹穿的比我還像新娘囱淋。我一直安慰自己,他們只是感情好餐塘,可當我...
    茶點故事閱讀 64,355評論 5 374
  • 文/花漫 我一把揭開白布妥衣。 她就那樣靜靜地躺著,像睡著了一般。 火紅的嫁衣襯著肌膚如雪税手。 梳的紋絲不亂的頭發(fā)上蜂筹,一...
    開封第一講書人閱讀 49,079評論 1 285
  • 那天,我揣著相機與錄音芦倒,去河邊找鬼狂票。 笑死,一個胖子當著我的面吹牛熙暴,可吹牛的內(nèi)容都是我干的。 我是一名探鬼主播慌盯,決...
    沈念sama閱讀 38,389評論 3 400
  • 文/蒼蘭香墨 我猛地睜開眼周霉,長吁一口氣:“原來是場噩夢啊……” “哼!你這毒婦竟也來了亚皂?” 一聲冷哼從身側(cè)響起俱箱,我...
    開封第一講書人閱讀 37,019評論 0 259
  • 序言:老撾萬榮一對情侶失蹤,失蹤者是張志新(化名)和其女友劉穎灭必,沒想到半個月后狞谱,有當?shù)厝嗽跇淞掷锇l(fā)現(xiàn)了一具尸體,經(jīng)...
    沈念sama閱讀 43,519評論 1 300
  • 正文 獨居荒郊野嶺守林人離奇死亡禁漓,尸身上長有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點故事閱讀 35,971評論 2 325
  • 正文 我和宋清朗相戀三年跟衅,在試婚紗的時候發(fā)現(xiàn)自己被綠了。 大學時的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片播歼。...
    茶點故事閱讀 38,100評論 1 333
  • 序言:一個原本活蹦亂跳的男人離奇死亡伶跷,死狀恐怖,靈堂內(nèi)的尸體忽然破棺而出秘狞,到底是詐尸還是另有隱情叭莫,我是刑警寧澤,帶...
    沈念sama閱讀 33,738評論 4 324
  • 正文 年R本政府宣布烁试,位于F島的核電站雇初,受9級特大地震影響,放射性物質(zhì)發(fā)生泄漏减响。R本人自食惡果不足惜靖诗,卻給世界環(huán)境...
    茶點故事閱讀 39,293評論 3 307
  • 文/蒙蒙 一、第九天 我趴在偏房一處隱蔽的房頂上張望辩蛋。 院中可真熱鬧呻畸,春花似錦、人聲如沸悼院。這莊子的主人今日做“春日...
    開封第一講書人閱讀 30,289評論 0 19
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽。三九已至绞愚,卻和暖如春叙甸,著一層夾襖步出監(jiān)牢的瞬間,已是汗流浹背位衩。 一陣腳步聲響...
    開封第一講書人閱讀 31,517評論 1 262
  • 我被黑心中介騙來泰國打工裆蒸, 沒想到剛下飛機就差點兒被人妖公主榨干…… 1. 我叫王不留,地道東北人糖驴。 一個月前我還...
    沈念sama閱讀 45,547評論 2 354
  • 正文 我出身青樓僚祷,卻偏偏與公主長得像,于是被迫代替她去往敵國和親贮缕。 傳聞我的和親對象是個殘疾皇子辙谜,可洞房花燭夜當晚...
    茶點故事閱讀 42,834評論 2 345

推薦閱讀更多精彩內(nèi)容