1. 程式人生 > 實用技巧 >kafka常見問題

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.回答