今天就跟大家聊聊有關如何從一個生產上的錯誤看kafka的消費再均衡問題,可能很多人都不太了解,為了讓大家更加了解,小編給大家總結了以下內容,希望大家根據(jù)這篇文章可以有所收獲。
成都創(chuàng)新互聯(lián)公司-專業(yè)網(wǎng)站定制、快速模板網(wǎng)站建設、高性價比新津縣網(wǎng)站開發(fā)、企業(yè)建站全套包干低至880元,成熟完善的模板庫,直接使用。一站式新津縣網(wǎng)站制作公司更省心,省錢,快速模板網(wǎng)站建設找我們,業(yè)務覆蓋新津縣地區(qū)。費用合理售后完善,十載實體公司更值得信賴。
項目在生產上的一段錯誤日志如下,
這是一段kafka的錯誤日志,大概的意思是說,
kafka的服務端在超過了 max.poll.interval.ms 時間內沒有收到某個消費者的心跳,認為該消費者已經“掛了”,所以進行了topic的分區(qū)所有權“再均衡”。
按照我的個人習慣,遇到類似這樣的生產問題,解決之后我會思考下涉及的技術細節(jié)并做整理。
如果對問題涉及的技術細節(jié)非常的了解,對于定位問題是非常有幫助的。本文就帶你深入了解下上面那個錯誤日志涉及的一些技術細節(jié)。
為了提高消息處理的高可用以及便于橫向擴展,kafka引入了topic的分區(qū)概念。屬于同一個消費者群組的消費者可以分擔的消費同一個topic不同分區(qū)的消息。從而達到分流的作用,可以使消息處理更高效。
topic A有三個分區(qū),同時我們有三個屬于同一個群組的消費者,這樣每個消費者可以負責消費一個分區(qū)。大家各自負責自己的分區(qū),系統(tǒng)有條不紊的運行著。
一般情況下,我們通過增加群組里的消費者數(shù)量來提高 kafka 的消費能力。不過要注意,不要讓消費者的數(shù)量超過主題分區(qū)的數(shù)量,多余的消費者只會被閑置。
kafka 的服務端需要一直監(jiān)控有哪些消費者在消費,監(jiān)控的機制是通過消費者不斷的發(fā)送心跳包實現(xiàn)的。消費者發(fā)送心跳有兩個途徑,一個是輪詢(poll,這里不是為了秀英文,注意聯(lián)系上面的錯誤日志),一個是消費后提交 offset 。
這兩種方式是兩個獨立的線程,互相不干擾。
只要消費者以正常的時間間隔發(fā)送心跳,就被認為是活躍的,說明它還在讀取分區(qū)里的消息,否則就被認為是已經“死亡”。
這個所謂的正常的時間間隔,就是不能超過 max.poll.interval.ms。
消費者通過向服務端發(fā)送心跳來維持它們和群組的從屬關系以及它們對分區(qū)的所有權關系。如果服務端認為某個消費者已經“死亡”,就會觸發(fā)一次再均衡。
前面說過,群組里的消費者共同讀取主題的分區(qū)。
比如有一個新的消費者加入群組,它讀取的是原本由其他消費者讀取的消息。當一個消費者被關閉或發(fā)生崩潰時,它就離開群組,原本由它讀取的分區(qū)將由群組里的其他消費者來讀取。
分區(qū)的所有權從一個消費者轉移到另一個消費者,這樣的行為被稱為再均衡。
再均衡有什么意義嗎?
當然,有了再均衡,我們可以放心的添加或者移除某個消費者,而不用擔心消息的丟失。
了解了相關的技術細節(jié)后,我們可以順藤摸瓜,慢慢排查問題?;谇懊娴姆治觯医o出幾個排查的方向:
看看某個消費者的服務是否已經掛了?
如果服務正常運行,服務所在的節(jié)點是否存在內存或者CPU占滿的情況,導致消費者無法及時的發(fā)送心跳等。我遇到的情況就是后者引起的。后來解決了內存占用滿的問題后,kafka的錯誤就不存在了。
根據(jù)自己實際的業(yè)務情況,考慮增加 max.poll.interval.ms 的值。
看完上述內容,你們對如何從一個生產上的錯誤看kafka的消費再均衡問題有進一步的了解嗎?如果還想了解更多知識或者相關內容,請關注創(chuàng)新互聯(lián)行業(yè)資訊頻道,感謝大家的支持。