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

 

  主要從兩條線來回答:

    首先是啟動了刪除topic的進程

    然后監聽刪除命令

 

  建議:

    

 

  最好是,輸入流量進行控制,然后再刪除

 

 

 
 
 

 

 

 

 

 

 

    

 

 

  

 

 

 

 

 

 

 

 

 

 

 

  


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM