https://github.com/apache/kafka/pull/17231
故事背景
不知道大家在開發專案的時候有沒有遇過一個情況,有一個類別實在太好用了所以被所有人關注和使用,然後隨時時間推演大家不斷把功能往裡面塞,一直塞一直爽,最後那個肥嫩嫩的類別遍佈整個專案各地,有一天整個專案要重新結構化,但該類別已經成為一個上帝般的存在,導致整個重構卡住 ...
如果你覺得上述劇情很熟悉很老梗,沒錯,Kafka
也有這麼一個故事,故事的主角就是KafkaConfig
,那麼該類別是如何成為上帝般的存在呢?就我的體感大概有三個原因:
上述原因再加上我沒想到的一路到現在,KafkaConfig
明明只是個參數檔卻有著數千行的大小,想當然爾,在Kafka
要更模組化的路上,KafkaConfig
就成了一顆很大的絆腳石,為了解決這個問題,將KafkaConfig
拆分的行為也陸續展開 ... 那麼我們拆分的邏輯是什麼?
解決辦法
首先,我們嘗試將參數分門別類,例如屬於 Quorum
的參數我們就獨立一個檔案來放,同時把只屬於Quorum
的參數邏輯(包含檢查與getter
)也一併移動過去,這樣就可以讓KafkaConfig
大幅度的瘦身。
寫到這裏,大家可能會有一個疑問,前面不是說KafkaConfig
遍佈整個專案,如果把Quorum
相關的邏輯抽到QuorumConfig
去了,那麼原本透過KafkaConfig
來使用Quorum
參數的類別該怎麼辦?沒錯,這是一個好問題,極端一點我們就是來針對Quorum
相關的程式碼進行重構,讓他們從原本依賴KafkaConfig
轉移到使用QuorumConfig
,然而這會有另一個難處是該些類別可能同時也需要其他參數檔,如果該些參數檔還沒分門別類的話,自然也只能從KafkaConfig
來拿取,那這個重構就很不重構了,原本只是要一個KafkaConfig
現在變成還多要一個QuorumConfig
...
因此在真正終結KafkaConfig
之前,我們需要一個暫時的解法,那就是允許KafkaConfig
回傳一個QuorumConfig
,這樣我們就不需要大規模重構各種建構式或是方法,只需要將KafkaConfig.quorumXX
改成KafkaConfig.quorumConfig.quorumXX
就好,如此不只降低了要重構的範圍,同時也替未來埋下伏筆,等有一天KafkaConfig
退位消失,我們就可以輕鬆的把KafkaConfig
移除直接引用QuorumConfig
,當然這個做法也不是沒有副作用,看看那精美的呼叫鏈 ...
等等,這樣故事就結束了嗎?當然還沒有,讓KafkaConfig
可以回傳QuorumConfig
還有一個非常重要的原因,那就是KafkaConfig
本身是一個動態的參數!什麼是動態的參數?Kafka
作為一個非常貼心的系統,允許使用者在線更改參數,例如你可以提高執行緒的數量且不用下線任何節點,而為了追求這個崇高的理念,Kafka
內許多元件都具備重新參數化的能力,而身為參數的化身KafkaConfig
自然要具備總是提供最新參數的能力,然而這個能力過於複雜目前無法直接下放到各個參數檔,因此為了讓抽出來的參數檔也能反應當下最新的參數,KafkaConfig
可以透過自身反應動態參數的能力,讓從自己生出來的參數檔也總是反應最新的參數 ... 聽起來是不是有點繞口,沒關係,社群上也有人曾經一頭霧水
廣告
歡迎訂閱全臺最鬆散的開源社群源來適你,上面不定期會有各種開源的廢文。也歡迎參加全臺最鬆散的開源討論頻道,上面有一群網友一起在刷開源技術