日常開(kāi)發(fā)中,相信大家都對(duì) Kafka 有所耳聞,Kafka 作為一個(gè)分布式的流處理平臺(tái),一般用來(lái)存儲(chǔ)和傳輸大量的消息數(shù)據(jù)。在 Kafka 中有三個(gè)重要概念,分別是 topic、partition 和 offset。77B28資訊網(wǎng)——每日最新資訊28at.com
- topic 是 kafka 中的消息以主題為單位進(jìn)行歸類的邏輯概念,生產(chǎn)者負(fù)責(zé)將消息發(fā)送到特定的主題,消費(fèi)者負(fù)責(zé)訂閱主題并進(jìn)行消費(fèi)。
- partition 是 topic 的物理概念,每個(gè) topic 可以細(xì)分為多個(gè) partition,每個(gè) partition 只屬于單個(gè) topic,并且包含不同的消息,partition 用于提高 topic 的存儲(chǔ)和消費(fèi)的性能和可擴(kuò)展性,可以將 topic 分散在多個(gè) broker 上,并支持多個(gè) consumer 并行消費(fèi)。
- offset 是 partition 中每條消息的唯一標(biāo)識(shí),是一個(gè)單調(diào)遞增且不變的值,由 kafka 自動(dòng)維護(hù),offset 用于定位和記錄消息在 partition 中的位置和消費(fèi)進(jìn)度,保證 partition 內(nèi)的消息有序。
本文將給大家介紹 offset 的相關(guān)概念,大綱如下:77B28資訊網(wǎng)——每日最新資訊28at.com
- offset 的作用和意義
- offset 的存儲(chǔ)和管理
- offset 的提交和重置
- offset 的消費(fèi)和保證
offset 的作用和意義
77B28資訊網(wǎng)——每日最新資訊28at.com
offset 是 Kafka 為每條消息分配的一個(gè)唯一的編號(hào),它表示消息在分區(qū)中的順序位置。offset 是從 0 開(kāi)始的,每當(dāng)有新的消息寫(xiě)入分區(qū)時(shí),offset 就會(huì)加 1。offset 是不可變的,即使消息被刪除或過(guò)期,offset 也不會(huì)改變或重用。77B28資訊網(wǎng)——每日最新資訊28at.com
offset 的作用主要有兩個(gè):77B28資訊網(wǎng)——每日最新資訊28at.com
- 一是用來(lái)定位消息。通過(guò)指定 offset,消費(fèi)者可以準(zhǔn)確地找到分區(qū)中的某條消息,或者從某個(gè)位置開(kāi)始消費(fèi)消息。
- 二是用來(lái)記錄消費(fèi)進(jìn)度。消費(fèi)者在消費(fèi)完一條消息后,需要提交 offset 來(lái)告訴 Kafka broker 自己消費(fèi)到哪里了。這樣,如果消費(fèi)者發(fā)生故障或重啟,它可以根據(jù)保存的 offset 來(lái)恢復(fù)消費(fèi)狀態(tài)。
offset 的存儲(chǔ)和管理
offset 的存儲(chǔ)和管理主要涉及到兩個(gè)方面:生產(chǎn)者端和消費(fèi)者端。77B28資訊網(wǎng)——每日最新資訊28at.com
生產(chǎn)者端
生產(chǎn)者在向 Kafka 發(fā)送消息時(shí),可以指定一個(gè)分區(qū)鍵(Partition Key),Kafka 會(huì)根據(jù)這個(gè)鍵和分區(qū)算法來(lái)決定消息應(yīng)該發(fā)送到哪個(gè)分區(qū)。如果沒(méi)有指定分區(qū)鍵,Kafka 會(huì)采用輪詢或隨機(jī)的方式來(lái)選擇分區(qū)。生產(chǎn)者也可以自定義分區(qū)算法。77B28資訊網(wǎng)——每日最新資訊28at.com
當(dāng)消息被寫(xiě)入到分區(qū)后,Kafka broker 會(huì)為消息分配一個(gè) offset,并返回給生產(chǎn)者。生產(chǎn)者可以根據(jù)返回的 offset 來(lái)確認(rèn)消息是否成功寫(xiě)入,并進(jìn)行重試或其他處理。77B28資訊網(wǎng)——每日最新資訊28at.com
消費(fèi)者端
消費(fèi)者在消費(fèi) Kafka 消息時(shí),需要維護(hù)一個(gè)當(dāng)前消費(fèi)的 offset 值,以及一個(gè)已提交的 offset 值。當(dāng)前消費(fèi)的 offset 值表示消費(fèi)者正在消費(fèi)的消息的位置,已提交的 offset 值表示消費(fèi)者已經(jīng)確認(rèn)消費(fèi)過(guò)的消息的位置。77B28資訊網(wǎng)——每日最新資訊28at.com
消費(fèi)者在消費(fèi)完一條消息后,需要提交 offset 來(lái)更新已提交的 offset 值。提交 offset 的方式有兩種:自動(dòng)提交和手動(dòng)提交。77B28資訊網(wǎng)——每日最新資訊28at.com
- 自動(dòng)提交:Kafka 提供了一個(gè)配置參數(shù) enable.auto.commit,默認(rèn)為 true,表示開(kāi)啟自動(dòng)提交功能。自動(dòng)提交功能會(huì)在后臺(tái)定期(由 auto.commit.interval.ms 參數(shù)控制)將當(dāng)前消費(fèi)的 offset 值提交給 Kafka broker。
- 手動(dòng)提交:如果 enable.auto.commit 設(shè)置為 false,則表示關(guān)閉自動(dòng)提交功能,此時(shí)消費(fèi)者需要手動(dòng)調(diào)用 commitSync 或 commitAsync 方法來(lái)提交 offset。手動(dòng)提交功能可以讓消費(fèi)者更靈活地控制何時(shí)以及如何提交 offset。
無(wú)論是自動(dòng)提交還是手動(dòng)提交,offset 的實(shí)際存儲(chǔ)位置都是在 Kafka 的一個(gè)內(nèi)置主題中:__consumer_offsets。這個(gè)主題有 50 個(gè)分區(qū)(可配置),每個(gè)分區(qū)存儲(chǔ)一部分消費(fèi)組(Consumer Group)的 offset 信息。Kafka broker 會(huì)根據(jù)消費(fèi)組 ID 和主題名來(lái)計(jì)算出一個(gè)哈希值,并將其映射到 __consumer_offsets 主題的某個(gè)分區(qū)上。77B28資訊網(wǎng)——每日最新資訊28at.com
__consumer_offsets 主題是 Kafka 0.9.0 版本引入的新特性,之前的版本是將 offset 存儲(chǔ)在 Zookeeper 中。但是 Zookeeper 不適合大量寫(xiě)入,因此后來(lái)改為存儲(chǔ)在 Kafka 自身中,提高了性能和可靠性。77B28資訊網(wǎng)——每日最新資訊28at.com
offset 的提交和重置
提交 offset 是消費(fèi)者在消費(fèi)完一條消息后,將當(dāng)前消費(fèi)的 offset 值更新到 Kafka broker 中的操作。提交 offset 的目的是為了記錄消費(fèi)進(jìn)度,以便在消費(fèi)者發(fā)生故障或重啟時(shí),能夠從上次消費(fèi)的位置繼續(xù)消費(fèi)。77B28資訊網(wǎng)——每日最新資訊28at.com
重置 offset 是消費(fèi)者在啟動(dòng)或運(yùn)行過(guò)程中,將當(dāng)前消費(fèi)的 offset 值修改為其他值的操作。重置 offset 的目的是為了調(diào)整消費(fèi)位置,以便在需要重新消費(fèi)或跳過(guò)某些消息時(shí),能夠?qū)崿F(xiàn)這個(gè)需求。77B28資訊網(wǎng)——每日最新資訊28at.com
提交 offset
提交 offset 的方式有兩種:自動(dòng)提交和手動(dòng)提交。前面已經(jīng)介紹過(guò)這兩種方式的區(qū)別和用法,這里不再贅述。需要注意的是,無(wú)論是自動(dòng)提交還是手動(dòng)提交,都不保證提交成功。因?yàn)?Kafka broker 可能發(fā)生故障或網(wǎng)絡(luò)延遲,導(dǎo)致提交失敗或延遲。因此,消費(fèi)者需要處理提交失敗或延遲的情況。77B28資訊網(wǎng)——每日最新資訊28at.com
- 提交失敗:如果提交失敗,消費(fèi)者可以選擇重試或放棄。重試的話,可能會(huì)導(dǎo)致多次提交同一個(gè) offset 值,但是不會(huì)影響正確性,因?yàn)?Kafka broker 會(huì)忽略重復(fù)的 offset 值。放棄的話,可能會(huì)導(dǎo)致下次啟動(dòng)時(shí)重新消費(fèi)已經(jīng)消費(fèi)過(guò)的消息,但是不會(huì)影響完整性,因?yàn)?Kafka 消息是冪等的。
- 提交延遲:如果提交延遲,消費(fèi)者可以選擇等待或繼續(xù)。等待的話,可能會(huì)導(dǎo)致消費(fèi)速度變慢,或者超過(guò) session.timeout.ms 參數(shù)設(shè)置的時(shí)間而被認(rèn)為已經(jīng)死亡。繼續(xù)的話,可能會(huì)導(dǎo)致下次啟動(dòng)時(shí)漏掉一些沒(méi)有提交成功的消息。
重置 offset
重置 offset 的方式有兩種:手動(dòng)重置和自動(dòng)重置。手動(dòng)重置是指消費(fèi)者主動(dòng)調(diào)用 seek 或 seekToBeginning 或 seekToEnd 方法來(lái)修改當(dāng)前消費(fèi)的 offset 值。自動(dòng)重置是指消費(fèi)者在啟動(dòng)時(shí)根據(jù) auto.offset.reset 參數(shù)來(lái)決定從哪個(gè)位置開(kāi)始消費(fèi)。77B28資訊網(wǎng)——每日最新資訊28at.com
- 手動(dòng)重置:手動(dòng)重置可以讓消費(fèi)者精確地控制從哪個(gè)位置開(kāi)始消費(fèi)。例如,如果想要重新消費(fèi)某個(gè)分區(qū)的所有消息,可以調(diào)用 seekToBeginning 方法將 offset 設(shè)置為 0;如果想要跳過(guò)某個(gè)分區(qū)的所有消息,可以調(diào)用 seekToEnd 方法將 offset 設(shè)置為最大值;如果想要從某個(gè)具體的位置開(kāi)始消費(fèi),可以調(diào)用 seek 方法將 offset 設(shè)置為任意值。
- 自動(dòng)重置:自動(dòng)重置可以讓消費(fèi)者在啟動(dòng)時(shí)根據(jù) auto.offset.reset 參數(shù)來(lái)決定從哪個(gè)位置開(kāi)始消費(fèi)。auto.offset.reset 參數(shù)有三個(gè)可選值:earliest, latest 和 none。earliest 表示從最早的可用消息開(kāi)始消費(fèi);latest 表示從最新的可用消息開(kāi)始消費(fèi);none 表示如果沒(méi)有可用的 offset,則拋出異常。
offset 的消費(fèi)和保證
offset 的消費(fèi)和保證主要涉及到兩個(gè)方面:順序性和一致性。77B28資訊網(wǎng)——每日最新資訊28at.com
順序性
順序性是指 Kafka 消息是否按照發(fā)送和接收的順序進(jìn)行處理。Kafka 只保證分區(qū)內(nèi)的順序性,即同一個(gè)分區(qū)內(nèi)的消息按照 offset 的順序進(jìn)行發(fā)送和接收。但是不保證主題內(nèi)或跨主題的順序性,即不同分區(qū)內(nèi)的消息可能會(huì)亂序發(fā)送和接收。因此,如果需要保證主題內(nèi)或跨主題的順序性,需要在生產(chǎn)者和消費(fèi)者端進(jìn)行額外的處理,例如使用同一個(gè)分區(qū)鍵或同一個(gè)消費(fèi)組。77B28資訊網(wǎng)——每日最新資訊28at.com
一致性
一致性是指 Kafka 消息是否能夠被正確地發(fā)送和接收,不會(huì)出現(xiàn)丟失或重復(fù)的情況。Kafka 提供了三種不同級(jí)別的一致性保證:最多一次(At most once),最少一次(At least once)和精確一次(Exactly once)。77B28資訊網(wǎng)——每日最新資訊28at.com
- 最多一次:最多一次是指 Kafka 消息只會(huì)被發(fā)送或接收一次或零次,不會(huì)出現(xiàn)重復(fù)的情況,但是可能會(huì)出現(xiàn)丟失的情況。這種保證的實(shí)現(xiàn)方式是在生產(chǎn)者端關(guān)閉重試功能,在消費(fèi)者端在消費(fèi)消息之前提交 offset。這種保證適用于對(duì)消息丟失不敏感的場(chǎng)景,例如日志收集或監(jiān)控。
- 最少一次:最少一次是指 Kafka 消息只會(huì)被發(fā)送或接收一次或多次,不會(huì)出現(xiàn)丟失的情況,但是可能會(huì)出現(xiàn)重復(fù)的情況。這種保證的實(shí)現(xiàn)方式是在生產(chǎn)者端開(kāi)啟重試功能,在消費(fèi)者端在消費(fèi)消息之后提交 offset。這種保證適用于對(duì)消息重復(fù)不敏感的場(chǎng)景,例如計(jì)數(shù)或累加。
- 精確一次:精確一次是指 Kafka 消息只會(huì)被發(fā)送或接收一次,不會(huì)出現(xiàn)丟失或重復(fù)的情況。這種保證的實(shí)現(xiàn)方式是在生產(chǎn)者端和消費(fèi)者端使用事務(wù)功能,在消費(fèi)者端使用冪等功能。這種保證適用于對(duì)消息丟失和重復(fù)都敏感的場(chǎng)景,例如轉(zhuǎn)賬或支付。
本文鏈接:http://www.www897cc.com/showinfo-26-11244-0.html理解Kafka offset
聲明:本網(wǎng)頁(yè)內(nèi)容旨在傳播知識(shí),若有侵權(quán)等問(wèn)題請(qǐng)及時(shí)與本網(wǎng)聯(lián)系,我們將在第一時(shí)間刪除處理。郵件:2376512515@qq.com
上一篇: CSS Mask 與切圖藝術(shù)
下一篇: 不可變模式篇:非常抓狂,這特么到底是哪里不對(duì)?