關於Kafka Fetch Session的討論

2021-09-07 19:13:59 字數 2464 閱讀 2868

kafka在1.1.0版本引入了fetch session的概念,旨在降低「無效」fetch請求對集群頻寬資源的占用。故事的背景是這樣的:

眾所周知,kafka的broker和consumer都會定期地向leader broker傳送fetch請求去獲取資料。對於分割槽數很多的topic而言,待傳送的fetch請求就會很大,從而整體上增加網路頻寬占用。即使這些分割槽沒有任何新的資料到來,follower和consumer構造的fetch請求都需要顯式地羅列出每個訂閱分割槽的詳細資料,這包括:分割槽號、該分割槽當前開始位移(log start offset)、位移以及能夠請求的最大位元組數。

下面我們以1.0.2版本為例檢視一下乙個普通的fetch請求有多大?首先啟動兩台broker伺服器,然後建立乙個replcation factor是2且有1000個分割槽的topic:test,之後觀察下列jmx指標的值,如下圖所示:

可以看出,對於這個有著1000個分割槽的topic而言,每台broker上接收到的fetch請求大小固定是12031個位元組,即大約12kb左右。即使我沒有給這個topic傳送過任何訊息(即consumer沒有可以消費的訊息),fetch請求都是這麼大。

下面我們再用1.1.0版本重試一下這個測試,依然是啟動兩台1.1.0版本的broker伺服器,然後建立乙個replication-factor是2,有1000個分割槽的topic,然後再次檢視fetch請求的大小,如下圖所示:

這次我們發現fetch請求大小的最大值可以達到12043位元組,而之後一定穩定在最小值33位元組上。從這兩組測試結果來看,顯然1.1.0版本在某些情況下極大地減少了fetch請求的大小,節省了網路頻寬(針對我們這個測試topic而言,網路流量節省了將近365倍!)。那麼這是怎麼做到的呢?首先先從fetch請求的協議格式開始說起。1.1.0之前最新的fetch請求格式是v6版本,如下圖所示:

v7與v6版本的差異我已經用紅框標識出來了,即在v7版本中新引入了3個主要的變化:session_id/epoch和forgetten_topics_data,其中session_id和epoch合稱為fetch session元資料。這裡面的fetch session即是1.1.0版本關於fetch請求的最大變化。乙個fetch session本質上封裝了乙個fetcher執行緒的狀態,broker端會快取若干個session在記憶體中,然後通過fetch response把相應的狀態傳送給clients端,這樣clients就能知曉當前這個fetcher的狀態,從而避免每次fetch請求中都重複性地請求無意義的資料。

在引入這個變化後,fetch請求被分成了兩類:full fetch請求和incremental fetch請求。在首次傳送fetch請求或當session狀態發生變化的時候,clients依然傳送和以往類似的完整fetch請求——也就是所謂的full fetch請求,而一旦session穩定下來,且沒有變更,那麼clients就能安全地傳送「**後」的fetch請求,即增量式fetch請求,從而起到節省頻寬的作用。

上面測試場景中第二張圖的max值就是full fetch請求的大小(即12043b),如果我們和圖1的fetch請求大小(12031b)做比較會發現v7版本中full fetch請求比之前v6版本的多了12位元組(12043 - 12031),這12個位元組就是session_id(4b), epoch(4b)和空forgetten_topics_data陣列(4b)所占用的記憶體空間。

full fetch請求的完整格式如下:,,

]}], forgotten_topics_data=}

由此可見在full fetch請求中session_id和session的epoch都是0。一旦發現這些分割槽的fetch session沒有變化,clients會自動切換成傳送增量式fetch請求,其格式如下:

如果我們驗證增量式fetch請求的大小,可以很容易地計算出其大小=4b(replica_id) + 4b(max_wait_time) + 8b(min_bytes&max_bytes)+ 1b(isolation_level)+ 4b (session_id) + 4b(epoch) + 4b(空topics陣列) + 4b(空forgotten_topics_data陣列)=33位元組,與圖2中穩定後的fetch請求大小正好吻合!

綜上所說,kafka在1.1.0版本引入了fetch session的概念以期望減少fetch請求對於網路頻寬的占用,從實際使用角度而言,這種減少對於超大規模的集群是有明顯提公升的,而對於一般的小集群其優化的效果則並非那麼顯著。不過鑑於這是對使用者透明的效能提公升,故總然是一件好事情~~

關於程式關於世界

首先,在學了1年多的軟體設計的基礎上,問下自己 程式是什麼?業務需求是什麼?程式有什麼用?什麼是演算法?什麼是資料庫?或許每個人的理解不同,會給出不同的答案。那麼自己的理解 程式是乙個讓計算機工作的流程,在程式寫好之後,計算機就會按照,程式設計師定義好流程在執行。其實很多時候,乙個程式的好壞,在於乙...

關於血液關於軟體

1 自然沉降法 將血袋垂直吊掛於4 2 冰箱內,使紅細胞自然下沉1 3d,或將血袋呈70 80 角立於冰箱,需用時,用一次性分漿器分出血漿,制得濃縮紅細胞。2 洗滌法 一般用生理鹽水反覆洗滌3 6次。經洗滌的紅細胞,除白細胞和血小板減少外,血漿蛋白也極少,紅細胞中殘存的血漿蛋白含量約為原總蛋白的1 ...

關於冷漠,關於愛情

我不知道為什麼今天又莫名其妙開始思考愛情這件事,隨之就解決了我一直無法面對冷漠這件事 被冷漠是我始終無法消化的一件事,每當遇見冷漠時,我總會覺得就像一團火把自己燒得面目全非,但對方卻毫無傷害。但我突然懂了,遇到冷漠時,體面的離開即可 在乎你的人一定會在你離開後,找到你跟你解釋為什麼 連解釋都來不及,...