Kafka2.0服務端啟動源碼

??Kafka 服務端通過Kafka.scala的主函數(shù)main方法啟動疹尾。KafkaServerStartable類提供讀取配置文件颖医、啟動/停止服務的方法量没。而啟動/停止服務最終調(diào)用的是KafkaServerstartup/shutdown方法丑罪。

啟動流程

  1. 啟動 zk 客戶端芍耘。
  2. 啟動動態(tài)配置佳谦。
  3. 啟動調(diào)度線程池戴涝。
  4. 啟動日志管理器的后臺線程,包括日志清理钻蔑、日志刷盤啥刻、日志刪除、日志壓縮咪笑。
  5. 啟動 NIO Socket 服務可帽。
    1. 初始化一個接收器Acceptor,即啟動 NIO Socket蒲肋。
    2. 添加num.network.threads個接收器到請求通道RequestChannel的處理器緩存ConcurrentHashMap蘑拯,key 為遞增編號,value 為處理器Processor兜粘。
    3. Acceptor執(zhí)行CountDownLatch.await等待通知啟動申窘。
    4. 緩存AcceptorConcurrentHashMap,key 為EndPoint孔轴,value 為Acceptor剃法。
  6. 啟動副本管理器。
  7. 在 zk 注冊 broker路鹰。
  8. 啟動控制器贷洲。
  9. 啟動組協(xié)調(diào)器。
  10. 啟動事務協(xié)調(diào)器晋柱。
  11. 初始化KafkaApis优构。
  12. 初始化處理器線程緩存池
    1. 啟動num.io.threads個請求處理器線程KafkaRequestHandler雁竞。
    2. 從阻塞隊列ArrayBlockingQueue獲取請求钦椭,調(diào)用KafkaApis.handle方法拧额,進行集中處理請求。
  13. 啟動處理器線程彪腔。
    1. 首先CountDownLatch.countDown通知喚醒Acceptor線程侥锦。
      1. 使用NIO.select輪詢。
      2. 如果有可接收就緒的事件德挣,則將當前的SocketChannel加入緩存隊列ConcurrentLinkedQueue
    2. 從上述緩存隊列取出SocketChannel恭垦,綁定到KafkaChannel
    3. 將接收到的請求緩存到限長阻塞隊列ArrayBlockingQueue

請求處理流程

服務端請求處理流程

詳細源碼分析

Acceptor 線程

def run() {
  serverChannel.register(nioSelector, SelectionKey.OP_ACCEPT) // 注冊接收事件
  startupComplete() // 通知 Acceptor 線程
  var currentProcessor = 0
  while (isRunning) {
    val ready = nioSelector.select(500) // 輪詢事件
    if (ready > 0) {
      val keys = nioSelector.selectedKeys()
      val iter = keys.iterator()
      while (iter.hasNext && isRunning) {
        val key = iter.next
        iter.remove()
        if (key.isAcceptable) { // 有可接受事件
          val processor = synchronized {
            currentProcessor = currentProcessor % processors.size
            processors(currentProcessor) // 緩存 Processor 
          }
          accept(key, processor) // 將 SocketChannel 緩存到隊列
        }
      }
    }
  }
}

Processor 線程

override def run() {
  startupComplete() // CountDownLatch.countDown 喚醒 Acceptor 線程格嗅。
  while (isRunning) {
    configureNewConnections() // 從緩存隊列取出 SocketChannel番挺,綁定到 KafkaChannel
    processNewResponses() // 處理返回客戶端的響應
    poll() // Kafka.Selector 輪詢讀取/寫入事件
    processCompletedReceives() // 處理客戶端的請求,放到阻塞隊列
    processCompletedSends() // 處理返回客戶端響應后的回調(diào)
    processDisconnected() // 斷開連接后的處理
  }
}

KafkaRequestHandler 線程阻塞隊列

def run() {
  while (!stopped) {
    val startSelectTime = time.nanoseconds
    // 從阻塞隊列拉取請求
    val req = requestChannel.receiveRequest(300) 

    req match {
      case request: RequestChannel.Request =>
        try {
          apis.handle(request) // 調(diào)用`KafkaApis.handle`方法吗浩,進行集中處理請求建芙。
        }
    }
  }
}

KSelector

??參考客戶端源碼分析。

最后編輯于
?著作權歸作者所有,轉(zhuǎn)載或內(nèi)容合作請聯(lián)系作者
  • 序言:七十年代末懂扼,一起剝皮案震驚了整個濱河市禁荸,隨后出現(xiàn)的幾起案子,更是在濱河造成了極大的恐慌阀湿,老刑警劉巖赶熟,帶你破解...
    沈念sama閱讀 218,204評論 6 506
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件,死亡現(xiàn)場離奇詭異陷嘴,居然都是意外死亡映砖,警方通過查閱死者的電腦和手機,發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 93,091評論 3 395
  • 文/潘曉璐 我一進店門灾挨,熙熙樓的掌柜王于貴愁眉苦臉地迎上來邑退,“玉大人,你說我怎么就攤上這事劳澄〉丶迹” “怎么了?”我有些...
    開封第一講書人閱讀 164,548評論 0 354
  • 文/不壞的土叔 我叫張陵秒拔,是天一觀的道長莫矗。 經(jīng)常有香客問我,道長砂缩,這世上最難降的妖魔是什么作谚? 我笑而不...
    開封第一講書人閱讀 58,657評論 1 293
  • 正文 為了忘掉前任,我火速辦了婚禮庵芭,結(jié)果婚禮上妹懒,老公的妹妹穿的比我還像新娘。我一直安慰自己双吆,他們只是感情好眨唬,可當我...
    茶點故事閱讀 67,689評論 6 392
  • 文/花漫 我一把揭開白布滔悉。 她就那樣靜靜地躺著,像睡著了一般单绑。 火紅的嫁衣襯著肌膚如雪。 梳的紋絲不亂的頭發(fā)上曹宴,一...
    開封第一講書人閱讀 51,554評論 1 305
  • 那天搂橙,我揣著相機與錄音,去河邊找鬼笛坦。 笑死区转,一個胖子當著我的面吹牛,可吹牛的內(nèi)容都是我干的版扩。 我是一名探鬼主播废离,決...
    沈念sama閱讀 40,302評論 3 418
  • 文/蒼蘭香墨 我猛地睜開眼,長吁一口氣:“原來是場噩夢啊……” “哼礁芦!你這毒婦竟也來了蜻韭?” 一聲冷哼從身側(cè)響起,我...
    開封第一講書人閱讀 39,216評論 0 276
  • 序言:老撾萬榮一對情侶失蹤柿扣,失蹤者是張志新(化名)和其女友劉穎肖方,沒想到半個月后,有當?shù)厝嗽跇淞掷锇l(fā)現(xiàn)了一具尸體未状,經(jīng)...
    沈念sama閱讀 45,661評論 1 314
  • 正文 獨居荒郊野嶺守林人離奇死亡俯画,尸身上長有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點故事閱讀 37,851評論 3 336
  • 正文 我和宋清朗相戀三年,在試婚紗的時候發(fā)現(xiàn)自己被綠了司草。 大學時的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片艰垂。...
    茶點故事閱讀 39,977評論 1 348
  • 序言:一個原本活蹦亂跳的男人離奇死亡,死狀恐怖埋虹,靈堂內(nèi)的尸體忽然破棺而出猜憎,到底是詐尸還是另有隱情革砸,我是刑警寧澤蜒简,帶...
    沈念sama閱讀 35,697評論 5 347
  • 正文 年R本政府宣布,位于F島的核電站渡冻,受9級特大地震影響辣辫,放射性物質(zhì)發(fā)生泄漏旦事。R本人自食惡果不足惜,卻給世界環(huán)境...
    茶點故事閱讀 41,306評論 3 330
  • 文/蒙蒙 一急灭、第九天 我趴在偏房一處隱蔽的房頂上張望姐浮。 院中可真熱鬧,春花似錦葬馋、人聲如沸卖鲤。這莊子的主人今日做“春日...
    開封第一講書人閱讀 31,898評論 0 22
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽蛋逾。三九已至集晚,卻和暖如春,著一層夾襖步出監(jiān)牢的瞬間区匣,已是汗流浹背偷拔。 一陣腳步聲響...
    開封第一講書人閱讀 33,019評論 1 270
  • 我被黑心中介騙來泰國打工, 沒想到剛下飛機就差點兒被人妖公主榨干…… 1. 我叫王不留亏钩,地道東北人莲绰。 一個月前我還...
    沈念sama閱讀 48,138評論 3 370
  • 正文 我出身青樓,卻偏偏與公主長得像姑丑,于是被迫代替她去往敵國和親蛤签。 傳聞我的和親對象是個殘疾皇子,可洞房花燭夜當晚...
    茶點故事閱讀 44,927評論 2 355

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