https://cwiki.apache.org/confluence/display/KAFKA/KIP-714%3A+Client+metrics+and+observability
背景故事
隨著Kafka
的應用越來越多越來越豐富,大家也會開始遇到各種陰陽怪氣的現象,因此集中監控和管理Kafka
客戶端也逐漸成為一個重要的課題,但是你們會怎麼管理呢?是不是需要收集很多客戶端指標才好判讀數據?說到收集客戶端指標,身為JVM
的一份子,我們想當而然就是使用JMX
來暴露各種資訊,也可以把JMX
的資訊串接到其他metrics
收集的系統,如此就可以好好觀察各個客戶端應用的指標 ... 就這樣嘛?
當然事情沒這麼單純,如果只是以JMX
來看的話,至少會有兩個問題,首先Java
偉大是很偉大,但這個世界畢竟不是只有Java
,光是靠JMX
暴露指標就會形成不同系統指標串接上的麻煩,畢竟其他系統必須要能讀懂JMX
指標。第二個則是就算串接可以使用JMX
,但難道要每一個客戶端都安裝一個串接的角色嘛?這不是光想就覺得很恐怖,畢竟真實的應用場景下可能有成千上萬的客戶端應用,光是部屬和管理可能就會讓你晚上做惡夢。
這就是爲何Kafka
要選擇整合OpenTelemetry
,跟著業界已經成為知名標準的協定,Kafka 3.7.0
之後可以將客戶端應用的各種指標以OpenTelemetry
的格式封裝,然後傳遞和存放到Kafka
伺服器端,換言之,上述的第一個問題就可以解決了,JMX
不夠權威是吧?那麼我們現在用OpenTelemetry
就沒話說了吧!至於第二個問題自然就是靠Kafka
伺服器端來解決,成千上萬的客戶端在啟動telemetry
後,都會自動定期的把指標傳遞到伺服器端,如此管理者就不需要再去部屬管理那些成千上萬的客戶端,只要好好地去伺服器那邊就可以把客戶端的各種指標以telemetry
的格式拿走。
欸等等,伺服器端怎麼保存那些指標?該不會又是放在topic
裡面?當然不是,或者說我們曾經想過這個方式,例如直接讓每個客戶端再內建一個producer
來偷偷傳遞metrics
到特定的topic
,當然這樣做簡單省事但可能也有一些副作用,首先如剛剛提到的客戶端成千上萬,再讓每個內建一個複雜的producer
,這個複雜就是好複雜成雙,不好不好。而且這樣還會出現一個尷尬的現象,那個用來傳metrics
的producer
是不是也需要一個producer
幫他傳遞metrics
。
所以呢,kafka
選擇了一個簡單粗暴的方式,設計一組新的請求來專門傳遞metrics
,同時在伺服器端允許維護者開發自己的接收者,也就是可以自己決定收到metrics
後愛幹啥就幹啥,如此如此,我們就可以省去把資料放在topic
的需求,同時也避免了尷尬的俄羅斯娃娃。
所以呢,如果你看到這裡覺得這個嶄新的metrics
機制真的是太帥了,那就現在立刻馬上下載kafka 3.7
以上的版本來玩玩看吧!
廣告
歡迎訂閱全臺最鬆散的開源社群源來適你,上面不定期會有各種開源的廢文。也歡迎參加全臺最鬆散的開源討論頻道,上面有一群網友一起在刷開源技術