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的零拷貝
解釋:
fileChannel.transferTo( position, count, socketChannel);
把磁盤文件讀取OS內核緩沖區后的fileChannel,直接轉給socketChannel發送;底層就是sendfile。消費者從broker讀取數據,就是由此實現。

主要從兩條線來回答:
首先是啟動了刪除topic的進程
然后監聽刪除命令
建議:
最好是,輸入流量進行控制,然后再刪除