摘要:Kafka網絡模塊之Server端,介紹Server端啓動、接收請求和處理請求的過程。
本文分享自華爲雲社區《Kafka網絡模塊-Server端》,原文做者:中間件小哥 。網絡
SocketServer 是 Kafka server 端用於處理請求的模塊,在 Kafka 啓動過程建立、初始化、啓動。socket
SocketServer啓動過程:url
- 按照 endpoint 順序初始化 Acceptor,每一個 endpoint 對應一個 Acceptor,爲每一個 Acceptor 建立 Processor(數量由 num.network.threads 配置項決定),並啓動 Acceptor,Acceptor 啓動後會經過 selector 監聽鏈接,並將新創建的鏈接交給 Processor 處理(輪詢選擇 Processor)
- 啓動全部 Processor
Acceptor啓動、監聽鏈接過程:
- Acceptor啓動後,會建立一個 serverSocketChannel,監聽在該 acceptor 對應的 endpoint 上,並在 selector 上註冊 OP_ACCEPT,而後進入死循環,每次循環,經過 selector 獲取就緒的 key(即前面註冊的 serverSocketChannel),代表有鏈接來到,而後經過 accept() 建立一個和該鏈接對應的 socketChannel,而後從該 acceptor 負責的 processors 中輪詢選擇一個,將該 socketChannel 交給選擇的 processor 處理,即將鏈接交給 processor。
- Acceptor 將鏈接交給 processor 處理,是將 socketChannel 加入 processor 的鏈接隊列 newConnection 中,processor 在 run 方法中會不斷地從中獲取並處理。
- Processor 從 newConnection 獲取到 socketChannel 後,在 selector 上註冊 OP_READ,並建立對應的 KafkaChannel。
Server端接收請求、處理的過程:.net
- Processor 收到 OP_READ 的事件就緒後,檢查並嘗試完成 SSL 握手和 SASL 校驗(此時不必定握手完成,因此在 Processor 收到 OP_READ 的事件就緒後,要先檢查並確保握手已經完成,SSL/SASL相關參考 9.4 節)
- SSL 握手和 SASL 校驗完成後,從 channel 中讀取數據,構造 NetworkReceive 對象,併入隊 stagedReceives
- 取出 stagedReceives 隊首元素(移除),加入 completedReceives
- 將 completedReceives 中的元素取出(不移除),構造 Request 對象,加入 requestQueue,移除對 OP_READ 的事件註冊,並將對應的 KafkaChannel 置爲 MUTED,再置爲 MUTED_AND_RESPONSE_PENDING
- KafkaRequestHandler 從 requestQueue 取出元素(移除),並交給 KafkaApi 模塊處理請求
- KafkaApi 處理完請求後,將響應放入對應的 processor 的 responseQueue 和 inflightResponses 中,並喚醒其 selector
- Processor 從 responseQueue 中取出響應(移除),若響應是須要發回給客戶端的,則將響應的 send 賦值給 KafkaChannel,並註冊 OP_WRITE 事件
- 當 channel 寫就緒後,將 send 寫入 channel 的寫 buffer,當 send 寫完後,移除對 OP_WRITE 事件的註冊,並將 send 加入 completedSends
- 從 inflightResponses 中移除對應的響應,執行響應回調,將 KafkaChannel 置爲 MUTED,再從 MUTED 置爲 NOT_MUTED,並從新添加 OP_READ 事件註冊
點擊關注,第一時間瞭解華爲雲新鮮技術~server