您好,登錄后才能下訂單哦!
這篇文章主要講解了“Kafka緩沖機制有什么作用”,文中的講解內容簡單清晰,易于學習與理解,下面請大家跟著小編的思路慢慢深入,一起來研究和學習“Kafka緩沖機制有什么作用”吧!
1、Kafka的客戶端緩沖機制
在客戶端發送消息給kafka服務器的時候,一定是有一個內存緩沖機制的。也就是說,消息會先寫入一個內存緩沖中,然后直到多條消息組成了一個Batch,才會一次網絡通信把Batch發送過去。
2、內存緩沖造成的頻繁GC問題
這種內存緩沖機制的本意,其實就是把多條消息組成一個Batch,一次網絡請求就是一個Batch或者多個Batch。這樣每次網絡請求都可以發送很多數據過去,避免了一條消息一次網絡請求。從而提升了吞吐量,即單位時間內發送的數據量。
但是問題來了,大家可以思考一下,一個Batch中的數據,會取出來然后封裝在底層的網絡包里,通過網絡發送出去到達Kafka服務器。這個Batch里的數據都發送過去了,現在Batch里的數據應該怎么處理?這些Batch里的數據此時可還在客戶端的JVM的內存里啊!那么此時從代碼實現層面,一定會嘗試避免任何變量去引用這些Batch對應的數據,然后嘗試觸發JVM自動回收掉這些內存垃圾。
這樣不斷的讓JVM回收垃圾,就可以不斷的清理掉已經發送成功的Batch了,然后就可以不斷的騰出來新的內存空間讓后面新的數據來使用。這種想法很好,但是實際線上運行的時候一定會有問題,最大的問題,就是JVM GC問題。JVM GC在回收內存垃圾的時候,他會有一個“Stop the World”的過程,也就是垃圾回收線程運行的時候,會導致其他工作線程短暫的停頓,這樣可以便于他自己安安靜靜的回收內存垃圾。
這個也很容易想明白,畢竟你要是在回收內存垃圾的時候,你的工作線程還在不斷的往內存里寫數據,制造更多的內存垃圾,那你讓人家JVM怎么回收垃圾?這就好比在大馬路上,如果地上有很多垃圾,現在要把垃圾都掃干凈,最好的辦法是什么?大家都讓開,把馬路空出來,然后清潔工就是把垃圾清理干凈。但是如果清潔工在清掃垃圾的時候,結果一幫人在旁邊不停的嗑瓜子扔瓜子殼,吃西瓜扔西瓜皮,不停的制造垃圾,你覺得清潔工內心啥感受?當然是很憤慨了,照這么搞,地上的垃圾永遠的都搞不干凈了!
現在JVM GC是越來越先進,從CMS垃圾回收器到G1垃圾回收器,核心的目標之一就是不斷的縮減垃圾回收的時候,導致其他工作線程停頓的時間。所以現在越是新款的垃圾回收器導致工作線程停頓的時間越短,但是再怎么短,他也還是存在啊!而如何盡可能在自己的設計上避免JVM頻繁的GC就是一個非常考驗水平的事兒了。
3、Kafka設計者實現的緩沖池機制
在Kafka客戶端內部,對這個問題實現了一個非常優秀的機制,就是緩沖池的機制。每個Batch底層都對應一塊內存空間,這個內存空間就是專門用來存放寫入進去的消息的。然后當一個Batch被發送到了kafka服務器,這個Batch的數據不再需要了,就意味著這個Batch的內存空間不再使用了。此時這個Batch底層的內存空間不要交給JVM去垃圾回收,而是把這塊內存空間給放入一個緩沖池里。這個緩沖池里放了很多塊內存空間,下次如果你又有一個新的Batch了,那么不就可以直接從這個緩沖池里獲取一塊內存空間就ok了?然后如果一個Batch發送出去了之后,再把內存空間給人家還回來不就好了?以此類推,循環往復。
感謝各位的閱讀,以上就是“Kafka緩沖機制有什么作用”的內容了,經過本文的學習后,相信大家對Kafka緩沖機制有什么作用這一問題有了更深刻的體會,具體使用情況還需要大家實踐驗證。這里是億速云,小編將為大家推送更多相關知識點的文章,歡迎關注!
免責聲明:本站發布的內容(圖片、視頻和文字)以原創、轉載和分享為主,文章觀點不代表本網站立場,如果涉及侵權請聯系站長郵箱:is@yisu.com進行舉報,并提供相關證據,一經查實,將立刻刪除涉嫌侵權內容。