在現代分布式系統中,確保數據處理的準確性和一致性是至關重要的。Apache Kafka,作為一個廣泛使用的流處理平臺,提供了強大的消息隊列和流處理功能。隨著業務需求的增長,Kafka 的事務消息功能應運而生,它允許應" />

日韩成人免费在线_国产成人一二_精品国产免费人成电影在线观..._日本一区二区三区久久久久久久久不

當前位置:首頁 > 科技  > 軟件

原理剖析| Kafka Exactly Once 語義實現原理:冪等性與事務消息

來源: 責編: 時間:2024-04-28 08:55:47 182觀看
導讀1、前言
在現代分布式系統中,確保數據處理的準確性和一致性是至關重要的。Apache Kafka,作為一個廣泛使用的流處理平臺,提供了強大的消息隊列和流處理功能。隨著業務需求的增長,Kafka 的事務消息功能應運而生,它允許應

1、前言   

bM928資訊網——每日最新資訊28at.com

在現代分布式系統中,確保數據處理的準確性和一致性是至關重要的。Apache Kafka,作為一個廣泛使用的流處理平臺,提供了強大的消息隊列和流處理功能。隨著業務需求的增長,Kafka 的事務消息功能應運而生,它允許應用程序以一種原子的方式處理消息,即要么所有消息都被正確處理,要么都不處理。本文將深入剖析 Kafka 的 Exactly-Once 語義實現原理,包括冪等性與事務消息的關鍵概念,以及它們是如何在 Kafka 中實現的。我們將探討 Kafka 事務的流程,事務提供的 ACID 保證,以及在實際應用中可能遇到的一些限制。無論您是 Kafka 的新手還是經驗豐富的開發者,本文都將為您提供有價值的見解和指導。bM928資訊網——每日最新資訊28at.com

bM928資訊網——每日最新資訊28at.com

bM928資訊網——每日最新資訊28at.com

2、消息隊列的事務場景

bM928資訊網——每日最新資訊28at.com

Kafka 目前用于流處理的場景:相當于一個有向無環圖(DAG,Directed acyclic graph)每個節點是一個 Kafka Topic,每條邊是一個流處理操作。在這樣的場景下,有兩種操作:bM928資訊網——每日最新資訊28at.com

? 消費上游消息并提交位點bM928資訊網——每日最新資訊28at.com

? 處理消息并發送到下游 TopicbM928資訊網——每日最新資訊28at.com

bM928資訊網——每日最新資訊28at.com

對于由這兩種操作構成的一組處理流程需要具備事務語義,這樣我們就可以不重復(Exactly Once)的處理上游消息并將結果可靠地存儲在下游 Topic 中。bM928資訊網——每日最新資訊28at.com

圖片圖片bM928資訊網——每日最新資訊28at.com

上圖是一個典型的 Kafka 事務的流程,我們可以看到:MySQL 的 binlog 作為上游數據源將數據寫入到 Kafka 中,Spark Streaming 從 Kafka 中讀取數據并進行處理,最后將處理結果寫入到另外兩個 Topic 中(圖中三個 Topic 位于同一集群中)。其中消費 Topic A 與寫入 Topic B 和 Topic C 的操作具備事務語義。bM928資訊網——每日最新資訊28at.com

bM928資訊網——每日最新資訊28at.com

bM928資訊網——每日最新資訊28at.com

3、Kafka 的 Exactly Once 語義

bM928資訊網——每日最新資訊28at.com

從上述的場景中我們可以發現,事務消息最主要的動機是在流處理中實現 Exactly Once 的語義,這可以分為:bM928資訊網——每日最新資訊28at.com

? 僅發送一次: 單分區僅發送一次由生產者冪等保證,多分區僅發送一次由事務機制保證bM928資訊網——每日最新資訊28at.com

? 僅消費一次: Kafka 通過消費位點的提交來控制消費進度,而消費位點的提交被抽象成向系統 topic 發送消息。這就使得發送和消費行為統一起來,只要解決了多分區發送消息的一致性就能實現 Exactly Once 語義bM928資訊網——每日最新資訊28at.com

bM928資訊網——每日最新資訊28at.com

bM928資訊網——每日最新資訊28at.com

4、生產者冪等性

bM928資訊網——每日最新資訊28at.com

在創建 Kafka 生產者時設置了 enable.idempotence 參數,用于開啟生產者冪等性。bM928資訊網——每日最新資訊28at.com

val props = new Properties()props.put(ProducerConfig.ENABLE_IDEMPOTENCE_CONFIG, "true")val producer = new KafkaProducer(props)

Kafka 的發送冪等是通過序列號來實現的,每個消息都會被分配一個序列號,序列號是遞增的,這樣就可以保證消息的順序性。當生產者發送消息時,會將消息的序列號和消息內容一起寫入到日志文件中,下次收到非預期序列號的消息就會返回 OutOfOrderSequenceException 異常。bM928資訊網——每日最新資訊28at.com

bM928資訊網——每日最新資訊28at.com

設置 enable.idempotence 參數后,生產者會檢查以下三個參數的值是否合法(ProducerConfig#postProcessAndValidateIdempotenceConfigs)bM928資訊網——每日最新資訊28at.com

? max.in.flight.requests.per.connection 必須小于 5bM928資訊網——每日最新資訊28at.com

? retries 必須大于 0bM928資訊網——每日最新資訊28at.com

? acks 必須設置為 allbM928資訊網——每日最新資訊28at.com

bM928資訊網——每日最新資訊28at.com

Kafka 將消息的序列號信息保存在分區維度的 .snapshot 文件中,格式如下(ProducerStateManager#ProducerSnapshotEntrySchema):bM928資訊網——每日最新資訊28at.com

圖片圖片bM928資訊網——每日最新資訊28at.com

我們可以發現,該文件中保存了 ProducerId、ProducerEpoch 和 LastSequence。所以冪等的約束為:相同分區、相同 Producer(id 和 epoch) 發送的消息序列號需遞增。即 Kafka 的生產者冪等性只在單連接、單分區生效,Producer 重啟或消息發送到其他分區就失去了冪等性的約束。bM928資訊網——每日最新資訊28at.com

bM928資訊網——每日最新資訊28at.com

.snapshot 文件在 log segment 滾動時更新,發生重啟后通過讀取 .snapshot 文件和最新的日志文件即可恢復 Producer 的狀態。Broker 的重啟或分區遷移并不會影響冪等性。bM928資訊網——每日最新資訊28at.com

bM928資訊網——每日最新資訊28at.com

bM928資訊網——每日最新資訊28at.com

5、事務消息流程

bM928資訊網——每日最新資訊28at.com

我們首先從 Demo 開始,來看一下如何使用 Kafka 客戶端完成一個事務:bM928資訊網——每日最新資訊28at.com

// 事務初始化val props = new Properties()...props.put(ProducerConfig.TRANSACTIONAL_ID_CONFIG, transactionalId)props.put(ProducerConfig.ENABLE_IDEMPOTENCE_CONFIG, "true")val producer = new KafkaProducer(props)producer.initTransactions()producer.beginTransaction()// 消息發送producer.send(RecordUtils.create(topic1, partition1, "message1"))producer.send(RecordUtils.create(topic2, partition2, "message2"))// 事務提交或回滾producer.commitTransaction()

bM928資訊網——每日最新資訊28at.com

5.1 事務初始化

Kafka Producer 啟動后我們使用兩個 API 來初始化事務:initTransactions 和 beginTransaction。bM928資訊網——每日最新資訊28at.com

bM928資訊網——每日最新資訊28at.com

回顧一下我們的 Demo,在發送消息時是發送到兩個不同分區中,這兩個分區可能在不同的 Broker 上,所以我們需要一個全局的協調者 TransactionCoordinator 來記錄事務的狀態。bM928資訊網——每日最新資訊28at.com

bM928資訊網——每日最新資訊28at.com

所以,在 initTransactions 中,Producer 首先發送 ApiKeys.FIND_COORDINATOR 請求獲取 TransactionCoordinator。bM928資訊網——每日最新資訊28at.com

bM928資訊網——每日最新資訊28at.com

之后即可向其發送 ApiKeys.INIT_PRODUCER_ID 請求獲取 ProducerId 及  ProducerEpoch(也是上文中用于冪等的字段)。此步驟生成的 id 和 epoch 會寫入內部 Topic __transaction_state 中,并且將事務的狀態置為 Empty。bM928資訊網——每日最新資訊28at.com

bM928資訊網——每日最新資訊28at.com

__transaction_state 是 compaction Topic,其中消息的 key 為客戶端設置的transactional.id(詳見 TransactionStateManager#appendTransactionToLog)。bM928資訊網——每日最新資訊28at.com

bM928資訊網——每日最新資訊28at.com

區別于 ProducerId 是服務端生成的內部屬性;TransactionId 由用戶設置,用于標識業務視角認為的“同一個應用”,啟動具有相同 TransactionId 的新 Producer 會使得未完成的事務被回滾并且來自舊 Producer(具有較小 epoch)的請求被拒絕掉。bM928資訊網——每日最新資訊28at.com

bM928資訊網——每日最新資訊28at.com

后續 beginTransaction 用于開始一個事務,該方法會創建一個 Producer 內部事務狀態,標識這一個事務的開始,并不會有 RPC 產生。bM928資訊網——每日最新資訊28at.com

bM928資訊網——每日最新資訊28at.com

5.2 消息發送

上一節說到 beginTransaction 只是更改 Producer 內部狀態,那么在第一條消息發送時才隱式開啟了事務:bM928資訊網——每日最新資訊28at.com

bM928資訊網——每日最新資訊28at.com

首先,Producer 會發送 ApiKeys.ADD_PARTITIONS_TO_TXN 請求到 TransactionCoordinator。TransactionCoordinator 會將這個分區加入到事務中,并更改事務的狀態為 Ongoing,這些信息被持久化到 __transaction_state 中。bM928資訊網——每日最新資訊28at.com

bM928資訊網——每日最新資訊28at.com

然后 Producer 使用 ApiKeys.PRODUCE 請求正常發送消息到對應的分區中。這條消息的可見性控制在下文消息消費一節中會詳細討論。bM928資訊網——每日最新資訊28at.com

bM928資訊網——每日最新資訊28at.com

5.3 事務提交與回滾

當所有消息發送完成后,Producer 可以選擇提交或回滾事務,此時:bM928資訊網——每日最新資訊28at.com

? TransactionCoordinator:具有當前事務所有相關分區的信息bM928資訊網——每日最新資訊28at.com

? 其他 Broker:已經將消息持久化到日志文件中bM928資訊網——每日最新資訊28at.com

bM928資訊網——每日最新資訊28at.com

接下來 Producer 調用 commitTransaction 會發送 ApiKeys.END_TXN 請求將事務狀態更改為 PrepareCommit(回滾事務對應狀態 PrepareAbort)并持久化到 __transaction_state 中,此時從 Producer 的視角來看整個事務已經結束了。bM928資訊網——每日最新資訊28at.com

bM928資訊網——每日最新資訊28at.com

TransactionCoordinator 會異步向各個 Broker 發送 ApiKeys.WRITE_TXN_MARKERS 請求,當所有參加事務的 Broker 都返回成功后,TransactionCoordinator 會將事務狀態更改為 CompleteCommit(回滾事務對應狀態 CompleteAbort)并持久化到 __transaction_state 中。bM928資訊網——每日最新資訊28at.com

bM928資訊網——每日最新資訊28at.com

5.4 消息的消費

某個分區的消息可能是事務消息與非事務消息混雜的,如下圖所示:bM928資訊網——每日最新資訊28at.com

圖片圖片bM928資訊網——每日最新資訊28at.com

在 Broker 處理 ApiKeys.PRODUCE 請求時,完成消息持久化會更新 LSO 到第一條未提交的事務消息的 offset。這樣在消費者消費消息時,可以通過 LSO 來判斷消息是否可見:如果設置了 isolation.level 為 read_committed 則只會消費 LSO 之前的消息。bM928資訊網——每日最新資訊28at.com

LSO(log stable offset): 它表示的是已經被成功復制到所有副本(replicas)并且可以被消費者安全消費的消息的最大偏移量。 bM928資訊網——每日最新資訊28at.com

bM928資訊網——每日最新資訊28at.com

但是我們可以發現 LSO 之前存在已回滾的消息(圖中紅色矩形)這些消息應該被過濾掉:在 Broker 處理 ApiKeys.WRITE_TXN_MARKERS 請求時,會將已回滾的消息索引寫入到 .txnindex 文件中(LogSegmentKafka#updateTxnIndex)。bM928資訊網——每日最新資訊28at.com

bM928資訊網——每日最新資訊28at.com

后續 Consumer 消費消息時還會收到對應區間的已取消事務消息列表,上圖區間中的該列表為:bM928資訊網——每日最新資訊28at.com

圖片圖片bM928資訊網——每日最新資訊28at.com

bM928資訊網——每日最新資訊28at.com

代表 offset 在 [2,5] 之間且由 id 為 11 的 Producer 發送的消息都已回滾。bM928資訊網——每日最新資訊28at.com

bM928資訊網——每日最新資訊28at.com

上文我們討論了 __transaction_state 的實現確保同一時間,同一 TransactionId 有且只有一個事務在進行中。所以可以使用 ProducerId 和 offset 區間定位回滾的消息不會發生沖突。bM928資訊網——每日最新資訊28at.com

bM928資訊網——每日最新資訊28at.com

bM928資訊網——每日最新資訊28at.com

6、Kafka 事務提供的 ACID 保證

bM928資訊網——每日最新資訊28at.com

? 原子性(Atomicity)bM928資訊網——每日最新資訊28at.com

Kafka 通過對 __transaction_state Topic 的寫入實現了事務狀態的轉移,保證了事務要么同時提交,要么同時回滾。bM928資訊網——每日最新資訊28at.com

bM928資訊網——每日最新資訊28at.com

? 一致性(Consistency)bM928資訊網——每日最新資訊28at.com

在事務進入 PrepareCommit 或 PrepareAbort 階段時, TransactionCoordinator 異步向所有參與事務的 Broker 提交或回滾事務。這使得 Kafka 的事務做不到強一致性,只能通過不斷重試保證最終一致性。bM928資訊網——每日最新資訊28at.com

bM928資訊網——每日最新資訊28at.com

? 隔離性(Isolation)bM928資訊網——每日最新資訊28at.com

Kafka 通過 LSO 機制和 .txnindex 文件來避免臟讀,實現讀已提交(Read Committed)的隔離級別。bM928資訊網——每日最新資訊28at.com

bM928資訊網——每日最新資訊28at.com

? 持久性(Durability)bM928資訊網——每日最新資訊28at.com

Kafka 通過將事務狀態寫入到 __transaction_state Topic 和消息寫入到日志文件中來保證持久性。bM928資訊網——每日最新資訊28at.com

bM928資訊網——每日最新資訊28at.com

bM928資訊網——每日最新資訊28at.com

7、Kafka 事務的限制

bM928資訊網——每日最新資訊28at.com

從功能上看,Kafka 事務并不能支持業務方事務,強限制上游的消費和下游寫入都需要是同一個 Kafka 集群,否則就不具備原子性保障。bM928資訊網——每日最新資訊28at.com

bM928資訊網——每日最新資訊28at.com

從性能上看,Kafka 事務的性能開銷主要體現在生產側:bM928資訊網——每日最新資訊28at.com

開啟事務時需要額外的 RPC 請求定位 TransactionCoordinator 并初始化數據bM928資訊網——每日最新資訊28at.com

消息發送需要在發送消息前向 TransactionCoordinator 同步請求添加分區,并將事務狀態的變化寫入到 __transaction_state TopicbM928資訊網——每日最新資訊28at.com

事務提交或回滾時需要向所有參與事務的 Broker 發送請求bM928資訊網——每日最新資訊28at.com

bM928資訊網——每日最新資訊28at.com

對于涉及分區較少且消息數量較多的事務,事務的開銷可以被均攤;反之,較多的同步 RPC 帶來的開銷會極大影響性能。并且每個生產者只能有一個事務在進行中,這就意味著事務的吞吐量會受到限制。bM928資訊網——每日最新資訊28at.com

bM928資訊網——每日最新資訊28at.com

消費側也有一定的影響:消費者只能看到 LSO 以下的消息,并且需要額外的索引文件來過濾已回滾的消息,這無疑會增加端到端的延遲。bM928資訊網——每日最新資訊28at.com

bM928資訊網——每日最新資訊28at.com

bM928資訊網——每日最新資訊28at.com

8、總結   

bM928資訊網——每日最新資訊28at.com

通過本文的深入分析,我們了解到 Kafka 的事務消息功能是如何在流處理場景中提供 Exactly-Once 語義的。Kafka 通過其事務 API 和內部機制,實現了消息發送的原子性、最終一致性、隔離性和持久性,盡管在實際應用中可能存在一些性能和功能上的限制。開發者和架構師應當充分理解這些概念,并在設計系統時考慮如何有效地利用 Kafka 的事務功能,以構建更加健壯和可靠的數據處理流程。bM928資訊網——每日最新資訊28at.com

bM928資訊網——每日最新資訊28at.com

AutoMQ 是構建于對象存儲之上的云原生 Kafka fork,在解決了 Kafka 已有的成本和彈性問題基礎上對 Kafka 100%兼容,因此在 AutoMQ 上也可以使用 Kafka 事務消息。AutoMQ 作為國內 Kafka 生態的忠實擁護者,我們將持續為 Kafka 技術愛好者帶來優質的 Kafka 技術內容分享,歡迎關注我們。bM928資訊網——每日最新資訊28at.com

bM928資訊網——每日最新資訊28at.com

本文鏈接:http://www.www897cc.com/showinfo-26-86061-0.html原理剖析| Kafka Exactly Once 語義實現原理:冪等性與事務消息

聲明:本網頁內容旨在傳播知識,若有侵權等問題請及時與本網聯系,我們將在第一時間刪除處理。郵件:2376512515@qq.com

上一篇: 阿里面試:RabbitMQ如何實現延遲隊列?

下一篇: 代碼質量一塌糊涂,特么離職了,新來的人都不知道從哪里,今天分享高質量命名方法論給你

標簽:
  • 熱門焦點
  • 分享六款相見恨晚的PPT模版網站, 祝你做出精美的PPT!

    1、OfficePLUSOfficePLUS網站旨在為全球Office用戶提供豐富的高品質原創PPT模板、實用文檔、數據圖表及個性化定制服務。優點:OfficePLUS是微軟官方網站,囊括PPT模板、Word模
  • 如何通過Python線程池實現異步編程?

    線程池的概念和基本原理線程池是一種并發處理機制,它可以在程序啟動時創建一組線程,并將它們置于等待任務的狀態。當任務到達時,線程池中的某個線程會被喚醒并執行任務,執行完任
  • 拼多多APP上線本地生活入口,群雄逐鹿萬億市場

    Tech星球(微信ID:tech618)文 | 陳橋輝 Tech星球獨家獲悉,拼多多在其APP內上線了“本地生活”入口,位置較深,位于首頁的“充值中心”內,目前主要售賣美食相關的
  • 自律,給不了Keep自由!

    來源 | 互聯網品牌官作者 | 李大為編排 | 又耳 審核 | 谷曉輝自律能不能給用戶自由暫時不好說,但大概率不能給Keep自由。近日,全球最大的在線健身平臺Keep正式登陸港交所,努力
  • 猿輔導與新東方的兩種“歸途”

    作者|卓心月 出品|零態LT(ID:LingTai_LT)如何成為一家偉大企業?答案一定是對“勢”的把握,這其中最關鍵的當屬對企業戰略的制定,且能夠站在未來看現在,即使這其中的
  • 重估百度丨大模型,能撐起百度的“今天”嗎?

    自象限原創 作者|程心 羅輯2023年之前,對于自己的“今天”,百度也很迷茫。“新業務到 2022 年底還是 0,希望 2023 年出來一個 1。”這是2022年底,李彥宏
  • OPPO K11搭載長壽版100W超級閃充:26分鐘充滿100%

    據此前官方宣布,OPPO將于7月25日也就是今天下午14:30舉辦新品發布會,屆時全新的OPPO K11將正式與大家見面,將主打旗艦影像,和同檔位競品相比,其最大的賣
  • 質感不錯!OPPO K11渲染圖曝光:旗艦IMX890傳感器首次下放

    一直以來,OPPO K系列機型都保持著較為均衡的產品體驗,歷來都是2K價位的明星機型,去年推出的OPPO K10和OPPO K10 Pro兩款機型憑借各自的出色配置,堪稱有
  • 北京:科技教育體驗基地開始登記

      北京“科技館之城”科技教育體驗基地登記和認證工作日前啟動。首批北京科技教育體驗基地擬于2023年全國科普日期間掛牌,后續還將開展常態化登記?! ”本┛萍冀逃w驗基
Top 主站蜘蛛池模板: 孝义市| 鲁山县| 敖汉旗| 青岛市| 丁青县| 饶河县| 湟源县| 麻江县| 龙岩市| 青龙| 鹰潭市| 运城市| 宜城市| 清水河县| 北流市| 河间市| 富阳市| 横山县| 滦南县| 卢湾区| 兖州市| 平塘县| 织金县| 什邡市| 洱源县| 若尔盖县| 云和县| 临漳县| 拉萨市| 南城县| 夏邑县| 诸城市| 德清县| 富平县| 禄丰县| 临汾市| 云南省| 乌鲁木齐市| 溧阳市| 平江县| 舒兰市|