Kafka如何管理自身的offset

2021-10-06 11:31:02 字數 1567 閱讀 5041

早在 0.8.2.2 版本,kafka已支援存入消費的 offset 到topic中,只是那時候預設是將消費的 offset 存放在 zookeeper 集群中。現在0.10.1.1及以後的版本中,

官方預設將消費的offset儲存在 kafka 的topic中

,同時,也保留了儲存在 zookeeper 的介面,

通過 offsets.storage 屬性來進行設定。

之前版本,kafka其實存在乙個比較大的隱患,就是利用 zookeeper 來儲存記錄每個消費者/組的消費進度。雖然,在使用過程當中,jvm幫助我們完成了一些優化,但是消費者需要頻繁的去與 zookeeper 進行互動,而

利用zkclient的api操作zookeeper頻繁的write

其本身就是乙個比較低效的action,對於後期水平擴充套件也是乙個比較頭疼的問題。

如果期間 zookeeper 集**生變化,那 kafka 集群的吞吐量也跟著受影響。

在新版 kafka 以及之後的版本,kafka 消費的offset都會預設存放在 kafka 集群中的乙個叫 __consumer_offsets 的topic中。

當然,其實她實現的原理也讓我們很熟悉,利用 kafka 自身的 topic,以消費的group,topic,以及partition做為組合 key。所有的消費offset都提交寫入到上述的topic中。因為這部分訊息是非常重要,以至於是不能容忍丟資料的,所以訊息的 acking 級別設定為了 -1,生產者等到所有的 isr 都收到訊息後才會得到 ack(資料安全性極好,當然,其速度會有所影響)。所以 kafka 又在記憶體中維護了乙個關於 group,topic 和 partition 的三元組來維護的 offset 資訊,消費者獲取的offset的時候會直接從記憶體中獲取。

kafka 提供三種語義的傳遞:

1至少一次

2至多一次

3較精確一次

首先在 producer 端保證1和2的語義是非常簡單的,至少一次只需要同步確認即可(確認方式分為只需要 leader 確認以及所有副本都確認,第二種更加具有容錯性),至多一次最簡單只需要非同步不斷的傳送即可,效率也比較高。目前在 producer 端還不能保證較精確一次,在未來有可能實現,實現方式如下:在同步確認的基礎上為每一條訊息加乙個主鍵,如果發現主鍵曾經接受過,則丟棄。

在 consumer 端,大家都知道可以控制 offset,所以可以控制消費,其實 offset 只有在重啟的時候才會用到。在機器正常執行時我們用的是 position,我們實時消費的位置也是 position 而不是 offset。我們可以得到每一條訊息的 position。如果我們在處理訊息之前就將當前訊息的 position 儲存到 zk 上即 offset,這就是只多一次消費,因為我們可能儲存成功後,訊息還沒有消費機器就掛了,當機器再開啟時此訊息就丟失了;或者我們可以先消費訊息然後儲存 position 到 zk 上即 offset,此時我們就是至少一次,因為我們可能在消費完訊息後offset 沒有儲存成功。而較精確一次的做法就是讓 position的儲存和訊息的消費成為原子性操作,比如將訊息和 position 同時儲存到 hdfs 上 ,此時儲存的 position 就稱為 offset,當機器重啟後,從 hdfs重新讀入offset,這就是較精確一次。

spark消費kafka時自助管理offset方法

offset的儲存位置 在kafka0.9版本之前消費者儲存的偏移量是在zookeeper中 consumers group.id offsets topic.name partition.id。新版消費者不再儲存偏移量到zookeeper中,而是儲存在kafka的乙個內部主題中 consumer ...

如何建立自身的自信

任何人的職場生涯中都會有不自信的時候,那麼可以從哪些方面著手鍛鍊自己的自信呢?1 從身體語言著手。在與人交流的時候,你應該抬頭,挺胸,放鬆肩膀,直視對方。與人握手切忌有氣無力。當對方與你交談時,記得與他保持眼神接觸。2 從著裝著手。選擇與你所處的行業與生活方式相搭配的服飾,這樣你才能感覺良好,而這能...

Kafka 如何理解Kafka的「快」?

據了解,kafka吞吐量峰值每秒百萬,就算在記憶體個cpu都不高的情況下,最高可達每秒十萬,並且還能做到持久化儲存。kafka如此高吞吐率的原因是什麼?隨機寫每秒幾十幾百k。作業系統從磁碟將資料copy dma copy 到核心空間緩衝區 kernel buffer 應用程式從核心空間緩衝區 ker...