kafka常見問題
1.問題
kafka的常見應用場景
kafka與其他訊息中介軟體的異同點
2.回答
概念:
kafka是分散式的流處理平臺
特性:
提供釋出訂閱及topic支援
吞吐量高,但是不保證訊息有序【因為取決於partition的消費情況】
提供了offset的管理,可以消費歷史資料。是日誌管理機制導致的,因為是從日誌檔案中檢索
3.應用場景回答
日誌的收集或者流式系統
訊息系統
使用者活動跟蹤或運營指標監控
4.問題
kafka為什麼吞吐量大
kafka為什麼速度快
5.回答
儲存方面:日誌順序讀寫和快速檢索
並行方面:partition機制
傳送與接受:批量傳送接收及批量資料壓縮機制
原則:通過sendfile實現零拷貝原則
6.問題
kafka的底層日誌原理
7.回答
日誌格式:
kafka的日誌是以partition為單位進行儲存
日誌目錄格式為topic名稱+數字
日誌檔案格式是一個“日誌條目”序列
每條日誌訊息是油4位元組整形與N位元組訊息組成
CRC:用於校驗訊息內容。佔4個位元組
MAGIC:用於標識kafka版本,預設是1。佔1個位元組
ATTRIBUTES:用於儲存訊息壓縮使用的編碼以及Timestamp型別。這個版本僅支援 gzip、snappy、lz4三種壓縮格式。後三位如果是000則表示沒有使用壓縮,如果是001則表示是gzip壓縮,如果是010則是snappy壓縮,如果是011則是snappy壓縮。第4位(從右數)如果為0,代表使用create time,如果為1代表append time。其餘位保留。佔1個位元組
TIMESTAMP:時間戳。佔8個位元組
KEY_SIZE:用於標識KEY內容的長度K。佔用4個位元組
KEY:儲存的是KEY的具體內容。佔用K個位元組。
VALUE_SIZE:主要標識VALUE的內容的長度V。佔用4個位元組。
VALUE:訊息的真實內容。佔用V個位元組
日誌分段
每個partition的日誌將會分為N個大小相等的segment中,方便檢索
每個segment中的訊息數量不一定相等
每個partition只支援順序讀寫,因為隨機讀寫速度慢
如果命中全域性的segmentList,則可以知道對應的segment
segment的儲存結構
patition會將訊息新增到最後一個segment上
當segment達到一定閾值會flush到磁碟上,consumer的訊息讀取是讀取的磁碟,在記憶體中的是讀取不到的
segment分為兩個部分,index與log【裡面是具體的資料】
日誌讀操作
比如:要查詢絕對offset為7的Message:
首先是用二分查詢確定它是在哪個LogSegment中,自然是在第一個Segment中。
開啟這個Segment的index檔案,也是用二分查詢找到offset小於或者等於指定offset的索引條目中最大的那個offset。自然offset為6的那個索引是我們要找的,通過索引檔案我們知道offset為6的Message在資料檔案中的位置為9807。
開啟資料檔案,從位置為9807的那個地方開始順序掃描直到找到offset為7的那條Message。
這套機制是建立在offset是有序的。索引檔案被對映到記憶體中,所以查詢的速度還是很快的。Kafka的Message儲存採用了分割槽(partition),分段(LogSegment)和稀疏索引這幾個手段來達到了高效性。
8.問腿
零拷貝
9.回答
傳統的讀取檔案資料併發送到網路的步驟如下: (1)作業系統將資料從磁碟檔案中讀取到核心空間的頁面快取; (2)應用程式將資料從核心空間讀入使用者空間緩衝區; (3)應用程式將讀到資料寫回核心空間並放入socket緩衝區; (4)作業系統將資料從socket緩衝區複製到網絡卡介面,此時資料才能通過網路傳送。
kafka的零拷貝
解釋:
Java NIO對sendfile的支援就是FileChannel.transferTo()/transferFrom()。fileChannel.transferTo( position, count, socketChannel);
把磁碟檔案讀取OS核心緩衝區後的fileChannel,直接轉給socketChannel傳送;底層就是sendfile。消費者從broker讀取資料,就是由此實現。 10.問題 消費者與消費者組 11.回答 kafka消費者組是kafka消費的單位 單個partition只能被消費者組中的某個消費者消費 消費者組中的單個消費者可以消費多個partition 12.問題 kafka的客戶端 13.問題 主要回答: 處理流程 啟動的執行緒,一個核心執行緒,一個守護執行緒,在建立的時候就完成了。傳送的時候,會新起一個執行緒,將資料傳送到佇列 時序的說法: client傳送send時,producer會將訊息append到守護程序上,守護程序會在滿足一定的情況下,將資料傳送給服務端,然後獲取future 如果需要知道結果,可以使用get的方式,或者使用回掉的方式 流程說法: 會將資料進行序列化,然後呼叫分割槽器,分別在partion上建立傳送批次 14.問題 怎麼保證資料的有效性 15.問題 kafka的特性是隻支援partition有序 大部分使用:kafka key + offset可以做到業務有序 16.問題 topic刪除背後做的事情 17.回答