iT邦幫忙

2024 iThome 鐵人賽

DAY 27
0
Software Development

每天罵爆一隻 Kafka Pull Request系列 第 27

KAFKA-17686 AsyncKafkaConsumer.offsetsForTimes() fails with NullPointerException

  • 分享至 

  • xImage
  •  

https://github.com/apache/kafka/pull/17353

背景故事

今天來聊聊一個有點小但意義深遠的故事,大家有用過時間戳記來查找資料嗎?對kafka有感覺的朋友應該會馬上跳起來,怎麼可以用時間戳記查找資料!那個速度不快!沒錯沒錯,身為一個優秀的Kafka使用者,我們牢記在心但只要是適當的使用,其實也會是一個很方便的工具。尤其當你的資料在應用上是很仰賴時間戳記,例如要基於時間區段去做統計、又或是要查找特定週期的事件時,透過時間戳記來定位資料就顯得十分重要。

接下來聊聊這個功能的定義:

Map<TopicPartition, OffsetAndTimestamp> offsetsForTimes(Map<TopicPartition, Long> timestampsToSearch)

這個方法的輸入是一個map結構,其中key就是你想查詢的partition,而value自然就是對應的時間戳記,至於回傳的內容就是partition以及其對應的offset和時間戳記。聽起來是不是很理所當然?那接下來我就要來個靈魂拷問了:

如果你要查詢的partition所擁有的資料並沒有你要的時間戳記時,這時候回傳值或怎樣表達?

  1. 回傳值就不會包含該partition
  2. 回傳值的OffsetAndTimestamp的結構會顯示沒有對應的時間戳記
  3. 回傳值依然會有partition只是對應的value會是null

給各位讀者三秒鐘思考一下
3
2
1

正確答案是選項三!

啥?沒錯,kafka會回傳一個擁有null valuemap結構,這句話是什麼意思呢,也就是containsKey(partition)會回傳true,但是get(partition)時會得到null。你或許心裡會想這是什麼陷阱題、這是什麼奇妙的設計,現在大多數的map結構應該都不允許塞null了吧,小編也同意這個想法,但是很不幸的是這隻API已經存在許多許多年,我們很難確定是否有使用者特別愛上述的使用方式,為了相容性也只能繼續維持這個邏輯。不過那是指舊版的consumer,新版的consumer也要維持笑相同的邏輯嗎?或者說新版的consumer也要繼續維護不好的使用方式嗎?這個就是下一個靈魂拷問了

身為讀者的你會怎麼想呢?究竟是一致的奇怪行為比較重要呢?還是應該在改版的時候把行為調整到更現代化呢?歡迎大家上來kafka一起討論,不管你有任何想法或是建議!

廣告

歡迎訂閱全臺最鬆散的開源社群源來適你,上面不定期會有各種開源的廢文。也歡迎參加全臺最鬆散的開源討論頻道,上面有一群網友一起在刷開源技術


上一篇
KAFKA-17738 upgrade base image from jdk8 to jdk11
下一篇
KIP-714 Client metrics and observability
系列文
每天罵爆一隻 Kafka Pull Request30
圖片
  直播研討會
圖片
{{ item.channelVendor }} {{ item.webinarstarted }} |
{{ formatDate(item.duration) }}
直播中

尚未有邦友留言

立即登入留言