https://github.com/apache/kafka/pull/17353
背景故事
今天來聊聊一個有點小但意義深遠的故事,大家有用過時間戳記來查找資料嗎?對kafka
有感覺的朋友應該會馬上跳起來,怎麼可以用時間戳記查找資料!那個速度不快!沒錯沒錯,身為一個優秀的Kafka
使用者,我們牢記在心但只要是適當的使用,其實也會是一個很方便的工具。尤其當你的資料在應用上是很仰賴時間戳記,例如要基於時間區段去做統計、又或是要查找特定週期的事件時,透過時間戳記來定位資料就顯得十分重要。
接下來聊聊這個功能的定義:
Map<TopicPartition, OffsetAndTimestamp> offsetsForTimes(Map<TopicPartition, Long> timestampsToSearch)
這個方法的輸入是一個map
結構,其中key
就是你想查詢的partition
,而value
自然就是對應的時間戳記,至於回傳的內容就是partition
以及其對應的offset
和時間戳記。聽起來是不是很理所當然?那接下來我就要來個靈魂拷問了:
如果你要查詢的partition
所擁有的資料並沒有你要的時間戳記時,這時候回傳值或怎樣表達?
partition
OffsetAndTimestamp
的結構會顯示沒有對應的時間戳記partition
只是對應的value
會是null
給各位讀者三秒鐘思考一下
3
2
1
正確答案是選項三!
啥?沒錯,kafka
會回傳一個擁有null value
的map
結構,這句話是什麼意思呢,也就是containsKey(partition)
會回傳true
,但是get(partition)
時會得到null
。你或許心裡會想這是什麼陷阱題、這是什麼奇妙的設計,現在大多數的map
結構應該都不允許塞null
了吧,小編也同意這個想法,但是很不幸的是這隻API
已經存在許多許多年,我們很難確定是否有使用者特別愛上述的使用方式,為了相容性也只能繼續維持這個邏輯。不過那是指舊版的consumer
,新版的consumer
也要維持笑相同的邏輯嗎?或者說新版的consumer
也要繼續維護不好的使用方式嗎?這個就是下一個靈魂拷問了
身為讀者的你會怎麼想呢?究竟是一致的奇怪行為比較重要呢?還是應該在改版的時候把行為調整到更現代化呢?歡迎大家上來kafka
一起討論,不管你有任何想法或是建議!
廣告
歡迎訂閱全臺最鬆散的開源社群源來適你,上面不定期會有各種開源的廢文。也歡迎參加全臺最鬆散的開源討論頻道,上面有一群網友一起在刷開源技術