成人免费xxxxx在线视频软件_久久精品久久久_亚洲国产精品久久久_天天色天天色_亚洲人成一区_欧美一级欧美三级在线观看

理解Kafka offset

開發 架構
提交 offset 是消費者在消費完一條消息后,將當前消費的 offset 值更新到 Kafka broker 中的操作。提交 offset 的目的是為了記錄消費進度,以便在消費者發生故障或重啟時,能夠從上次消費的位置繼續消費。

日常開發中,相信大家都對 Kafka 有所耳聞,Kafka 作為一個分布式的流處理平臺,一般用來存儲和傳輸大量的消息數據。在 Kafka 中有三個重要概念,分別是 topic、partition 和 offset。

  • topic 是 kafka 中的消息以主題為單位進行歸類的邏輯概念,生產者負責將消息發送到特定的主題,消費者負責訂閱主題并進行消費。
  • partition 是 topic 的物理概念,每個 topic 可以細分為多個 partition,每個 partition 只屬于單個 topic,并且包含不同的消息,partition 用于提高 topic 的存儲和消費的性能和可擴展性,可以將 topic 分散在多個 broker 上,并支持多個 consumer 并行消費。
  • offset 是 partition 中每條消息的唯一標識,是一個單調遞增且不變的值,由 kafka 自動維護,offset 用于定位和記錄消息在 partition 中的位置和消費進度,保證 partition 內的消息有序。

本文將給大家介紹 offset 的相關概念,大綱如下

  • offset 的作用和意義
  • offset 的存儲和管理
  • offset 的提交和重置
  • offset 的消費和保證

offset 的作用和意義

圖片

offset 是 Kafka 為每條消息分配的一個唯一的編號,它表示消息在分區中的順序位置。offset 是從 0 開始的,每當有新的消息寫入分區時,offset 就會加 1。offset 是不可變的,即使消息被刪除或過期,offset 也不會改變或重用。

offset 的作用主要有兩個:

  • 一是用來定位消息。通過指定 offset,消費者可以準確地找到分區中的某條消息,或者從某個位置開始消費消息。
  • 二是用來記錄消費進度。消費者在消費完一條消息后,需要提交 offset 來告訴 Kafka broker 自己消費到哪里了。這樣,如果消費者發生故障或重啟,它可以根據保存的 offset 來恢復消費狀態。

offset 的存儲和管理

offset 的存儲和管理主要涉及到兩個方面:生產者端和消費者端。

生產者端

生產者在向 Kafka 發送消息時,可以指定一個分區鍵(Partition Key),Kafka 會根據這個鍵和分區算法來決定消息應該發送到哪個分區。如果沒有指定分區鍵,Kafka 會采用輪詢或隨機的方式來選擇分區。生產者也可以自定義分區算法。

當消息被寫入到分區后,Kafka broker 會為消息分配一個 offset,并返回給生產者。生產者可以根據返回的 offset 來確認消息是否成功寫入,并進行重試或其他處理。

消費者端

消費者在消費 Kafka 消息時,需要維護一個當前消費的 offset 值,以及一個已提交的 offset 值。當前消費的 offset 值表示消費者正在消費的消息的位置,已提交的 offset 值表示消費者已經確認消費過的消息的位置。

消費者在消費完一條消息后,需要提交 offset 來更新已提交的 offset 值。提交 offset 的方式有兩種:自動提交和手動提交。

  • 自動提交:Kafka 提供了一個配置參數 enable.auto.commit,默認為 true,表示開啟自動提交功能。自動提交功能會在后臺定期(由 auto.commit.interval.ms 參數控制)將當前消費的 offset 值提交給 Kafka broker。
  • 手動提交:如果 enable.auto.commit 設置為 false,則表示關閉自動提交功能,此時消費者需要手動調用 commitSync 或 commitAsync 方法來提交 offset。手動提交功能可以讓消費者更靈活地控制何時以及如何提交 offset。

無論是自動提交還是手動提交,offset 的實際存儲位置都是在 Kafka 的一個內置主題中:__consumer_offsets。這個主題有 50 個分區(可配置),每個分區存儲一部分消費組(Consumer Group)的 offset 信息。Kafka broker 會根據消費組 ID 和主題名來計算出一個哈希值,并將其映射到 __consumer_offsets 主題的某個分區上。

__consumer_offsets 主題是 Kafka 0.9.0 版本引入的新特性,之前的版本是將 offset 存儲在 Zookeeper 中。但是 Zookeeper 不適合大量寫入,因此后來改為存儲在 Kafka 自身中,提高了性能和可靠性。

offset 的提交和重置

提交 offset 是消費者在消費完一條消息后,將當前消費的 offset 值更新到 Kafka broker 中的操作。提交 offset 的目的是為了記錄消費進度,以便在消費者發生故障或重啟時,能夠從上次消費的位置繼續消費。

重置 offset 是消費者在啟動或運行過程中,將當前消費的 offset 值修改為其他值的操作。重置 offset 的目的是為了調整消費位置,以便在需要重新消費或跳過某些消息時,能夠實現這個需求。

提交 offset

提交 offset 的方式有兩種:自動提交和手動提交。前面已經介紹過這兩種方式的區別和用法,這里不再贅述。需要注意的是,無論是自動提交還是手動提交,都不保證提交成功。因為 Kafka broker 可能發生故障或網絡延遲,導致提交失敗或延遲。因此,消費者需要處理提交失敗或延遲的情況。

  • 提交失敗:如果提交失敗,消費者可以選擇重試或放棄。重試的話,可能會導致多次提交同一個 offset 值,但是不會影響正確性,因為 Kafka broker 會忽略重復的 offset 值。放棄的話,可能會導致下次啟動時重新消費已經消費過的消息,但是不會影響完整性,因為 Kafka 消息是冪等的。
  • 提交延遲:如果提交延遲,消費者可以選擇等待或繼續。等待的話,可能會導致消費速度變慢,或者超過 session.timeout.ms 參數設置的時間而被認為已經死亡。繼續的話,可能會導致下次啟動時漏掉一些沒有提交成功的消息。

重置 offset

重置 offset 的方式有兩種:手動重置和自動重置。手動重置是指消費者主動調用 seek 或 seekToBeginning 或 seekToEnd 方法來修改當前消費的 offset 值。自動重置是指消費者在啟動時根據 auto.offset.reset 參數來決定從哪個位置開始消費。

  • 手動重置:手動重置可以讓消費者精確地控制從哪個位置開始消費。例如,如果想要重新消費某個分區的所有消息,可以調用 seekToBeginning 方法將 offset 設置為 0;如果想要跳過某個分區的所有消息,可以調用 seekToEnd 方法將 offset 設置為最大值;如果想要從某個具體的位置開始消費,可以調用 seek 方法將 offset 設置為任意值。
  • 自動重置:自動重置可以讓消費者在啟動時根據 auto.offset.reset 參數來決定從哪個位置開始消費。auto.offset.reset 參數有三個可選值:earliest, latest 和 none。earliest 表示從最早的可用消息開始消費;latest 表示從最新的可用消息開始消費;none 表示如果沒有可用的 offset,則拋出異常。

offset 的消費和保證

offset 的消費和保證主要涉及到兩個方面:順序性和一致性。

順序性

順序性是指 Kafka 消息是否按照發送和接收的順序進行處理。Kafka 只保證分區內的順序性,即同一個分區內的消息按照 offset 的順序進行發送和接收。但是不保證主題內或跨主題的順序性,即不同分區內的消息可能會亂序發送和接收。因此,如果需要保證主題內或跨主題的順序性,需要在生產者和消費者端進行額外的處理,例如使用同一個分區鍵或同一個消費組。

一致性

一致性是指 Kafka 消息是否能夠被正確地發送和接收,不會出現丟失或重復的情況。Kafka 提供了三種不同級別的一致性保證:最多一次(At most once),最少一次(At least once)和精確一次(Exactly once)。

  • 最多一次:最多一次是指 Kafka 消息只會被發送或接收一次或零次,不會出現重復的情況,但是可能會出現丟失的情況。這種保證的實現方式是在生產者端關閉重試功能,在消費者端在消費消息之前提交 offset。這種保證適用于對消息丟失不敏感的場景,例如日志收集或監控。
  • 最少一次:最少一次是指 Kafka 消息只會被發送或接收一次或多次,不會出現丟失的情況,但是可能會出現重復的情況。這種保證的實現方式是在生產者端開啟重試功能,在消費者端在消費消息之后提交 offset。這種保證適用于對消息重復不敏感的場景,例如計數或累加。
  • 精確一次:精確一次是指 Kafka 消息只會被發送或接收一次,不會出現丟失或重復的情況。這種保證的實現方式是在生產者端和消費者端使用事務功能,在消費者端使用冪等功能。這種保證適用于對消息丟失和重復都敏感的場景,例如轉賬或支付。
責任編輯:武曉燕 來源: waynaqua
相關推薦

2019-07-16 13:15:38

Kafka分布式數據

2018-08-20 08:30:05

Kafka架構系統

2022-08-14 07:14:50

Kafka零拷貝

2024-07-03 08:28:44

HWKafkaLEO

2022-09-23 11:00:27

KafkaZookeeper機制

2023-04-10 08:07:48

MySQLlimitoffset

2024-02-19 08:17:10

Kafka消息隊列收發消息

2021-06-09 06:41:11

OFFSETLIMIT分頁

2022-04-11 11:55:34

架構技術調優

2022-10-27 21:34:28

數據庫機器學習架構

2021-03-22 08:30:33

Kafka源碼架構開發技術

2022-02-19 21:22:23

Kafka事務API的

2024-08-23 16:04:45

2023-06-06 08:18:24

Kafka架構應用場景

2020-10-12 08:09:39

JMM理解

2021-03-31 07:52:22

SQL Server數據庫SET ROWCOUN

2024-03-15 08:23:26

異步編程函數

2023-11-24 09:41:41

組件布局鴻蒙

2017-03-06 16:56:37

深度學習本質現狀

2016-12-19 15:09:02

Jedis源碼
點贊
收藏

51CTO技術棧公眾號

主站蜘蛛池模板: 久久99国产精品 | 国产999精品久久久影片官网 | 完全免费在线视频 | 欧美一级二级在线观看 | 日韩在线免费视频 | 久久精品国产亚洲 | 超碰天天 | 亚洲狠狠 | 国产精品久久久久久久粉嫩 | 欧美色综合一区二区三区 | 一区二区三区影院 | 精品福利一区 | 女同久久另类99精品国产 | 成人影视网| 国产欧美精品区一区二区三区 | 亚洲一区二区三 | 日韩精品一区二区三区高清免费 | 久久精品女人天堂av | 免费成人高清在线视频 | 伊人影院在线观看 | 午夜影院在线视频 | 欧美日韩综合 | 色欧美片视频在线观看 | 久久久一区二区三区 | 日韩和的一区二区 | 中文字幕在线三区 | 超碰成人在线观看 | 国产成人久久精品一区二区三区 | 日本久久久一区二区三区 | 一区二区免费 | 精品欧美一区二区中文字幕视频 | 久久久久国产精品一区 | 操人网站 | 国产午夜精品视频 | 亚洲福利视频一区二区 | 亚洲高清视频一区二区 | 国产精久久久久久久妇剪断 | 国产不卡一 | 亚洲精品一区二区在线 | 在线免费看91 | 国产精品毛片一区二区在线看 |