Kafka 中的冪等機制

Kafka 中的 冪等性(Idempotence) 是生產者端的重要機制,旨在確保即使在網絡抖動、重試、Broker 重啟等情況下,同一條消息不會被重復寫入到 Topic 中。這是實現可靠消息傳遞、避免重復消費的關鍵手段之一。

? 什么是冪等性?

簡單說:無論一個操作執行多少次,結果都是一樣的。

在 Kafka 中,冪等性意味著:

相同的消息,即使發送多次,也只會被寫入一次,且不會重復出現在日志中。

? Kafka 冪等性的作用場景

生產者可能會因為以下情況 重試發送 消息:

  • 網絡超時,未收到 Broker 的 ack;
  • Kafka Broker 重啟;
  • 客戶端主動重試(retries > 0);
  • Leader 重新選舉。

這些重試可能會導致:同一條消息寫入多次,從而帶來“重復消費”的問題。

Kafka 的冪等性功能可以自動解決這個問題,不用你在應用層手動做去重。

? 如何開啟冪等性?

從 Kafka 0.11 版本開始支持冪等性。

? 開啟方式

Kafka 2.0 版本之后,冪等性可以通過如下方式開啟:

Properties props = new Properties();
props.put("enable.idempotence", "true");  // ? 顯式開啟
KafkaProducer<String, String> producer = new KafkaProducer<>(props);

注意

  • acks=all 是開啟冪等性的默認要求。
  • Kafka 2.5+ 中,enable.idempotence 默認就是 true。

? Kafka 是如何實現冪等性的?

Kafka 利用了以下幾個機制:

1. Producer ID(PID)

  • 每個生產者初始化時,Kafka 分配一個唯一的 PID(Producer ID)。
  • Kafka 會記住這個 PID 發給哪個 Partition 了哪些消息。

2. Sequence Number(序列號)

  • Kafka 給每個消息分配一個自增的 Sequence Number每個 Partition 單獨維護
  • Broker 在每個 Partition 中,記錄下最近收到的 PID 和對應的序號。

? Kafka 判斷是否是重復消息的規則:

如果某個 PID + Partition 下,收到一條消息,其 Sequence Number 是重復的或小于上一次的,說明是重試的重復消息,Kafka 會自動丟棄它

? 冪等性 vs 事務,有什么區別?

特性冪等性(Idempotence)事務(Transaction)
作用避免消息重復寫入保證多條消息的原子提交
粒度單條消息一組消息
范圍單個 partition、單個 producer多 partition、消費者偏移、多個 Topic
是否有回滾? 無? 有
消費者是否感知? 不感知? read_committed 下感知

可以理解為:

冪等性是事務的基礎。Kafka 啟用事務時,會自動啟用冪等性,但單獨開啟冪等性不等于開啟事務。

? 使用冪等性的推薦配置

enable.idempotence=true      ? 開啟冪等性
acks=all                     ? 所有副本都要確認
retries=Integer.MAX_VALUE    ? 無限重試,確保最終寫入成功
max.in.flight.requests.per.connection=1(舊版本)? 限制同時請求數,確保順序(Kafka 2.4+ 可放寬為5)

?? 若你設置 max.in.flight.requests.per.connection > 1,在舊版本 Kafka(<2.4)中可能會造成亂序+重復寫入,不再冪等

? 總結一句話

Kafka 冪等性 = 在網絡失敗或客戶端重試時,確保消息只被寫入一次,自動去重,避免重復消費問題。

它是 實現可靠消息系統的第一步,在開啟事務或處理金融、支付等關鍵數據時非常重要。

本文來自互聯網用戶投稿,該文觀點僅代表作者本人,不代表本站立場。本站僅提供信息存儲空間服務,不擁有所有權,不承擔相關法律責任。
如若轉載,請注明出處:http://www.pswp.cn/diannao/77199.shtml
繁體地址,請注明出處:http://hk.pswp.cn/diannao/77199.shtml
英文地址,請注明出處:http://en.pswp.cn/diannao/77199.shtml

如若內容造成侵權/違法違規/事實不符,請聯系多彩編程網進行投訴反饋email:809451989@qq.com,一經查實,立即刪除!

相關文章

用c語言寫一個linux進程之間通信(聊天)的簡單程序

使用talk 用戶在同一臺機器上talk指令格式如下&#xff1a; ? talk 用戶名ip地址 [用戶終端號] 如果用戶只登錄了一個終端&#xff0c;那么可以不寫用戶終端號&#xff0c;如&#xff1a; talk userlocalhost可以使用who指令來查看當前有哪些用戶登錄&#xff0c;他的終端號…

深入探索Scala:從基礎到進階的全面總結

在大數據技術領域&#xff0c;Scala語言憑借其獨特優勢占據重要地位。它與Spark緊密相連&#xff0c;為大數據計算提供強大支持。今天&#xff0c;讓我們一同深入回顧Scala從基礎到進階的關鍵知識點。 Scala開發環境搭建是入門的第一步&#xff0c;需確保JDK安裝成功&#xff0…

【每日一個知識點】分布式數據湖與實時計算

在現代數據架構中&#xff0c;分布式數據湖&#xff08;Distributed Data Lake&#xff09; 結合 實時計算&#xff08;Real-time Computing&#xff09; 已成為大數據處理的核心模式。數據湖用于存儲海量的結構化和非結構化數據&#xff0c;而實時計算則確保數據能夠被迅速處理…

GPT-5、o3和o4-mini即將到來

原計劃有所變更: 關于我們應有何期待的一些零散想法。 深度研究(Deep Research)確實強大但成本高昂且速度較慢(當前使用o3模型)。即將推出的o4-mini在性能上可能與o3相近,但將突破這些限制,讓全球用戶——甚至免費用戶(盡管會有速率限制)——都能用上世界頂級AI研究助…

Spring Cloud LoadBalancer負載均衡+算法切換

目錄 介紹核心功能負載均衡啟動兩個支付服務訂單模塊引入依賴LoadBalanced 注解啟動訂單服務測試結果 負載均衡算法切換總結 介紹 Spring Cloud LoadBalancer 是 Spring Cloud 提供的客戶端負載均衡解決方案&#xff0c;提供更現代化的 API 和更好的 Spring 生態系統集成。它支…

Chrome 瀏覽器插件收錄

1. Responsive Viewer 可以在同個窗口內&#xff0c;針對同一網站&#xff0c;添加多個不同設備屏幕顯示。 在前端開發&#xff0c;需要多端適配&#xff0c;尤其是移動端響應式適配的網站開發中&#xff0c;可以同時測試多個不同屏幕的適配效果。 2. VisBug 提供工具欄&#x…

SQL 函數概述

SQL 函數概述 SQL 函數可以分為幾大類&#xff0c;不同數據庫系統可能有略微不同的實現。以下是主要的 SQL 函數分類&#xff1a; 1. 聚合函數 (Aggregate Functions) COUNT() - 計算行數 SUM() - 計算總和 AVG() - 計算平均值 MIN() - 找最小值 MAX() - 找最大值 GROUP…

MySQL學習筆記九

第十一章使用數據處理函數 11.1函數 SQL支持函數來處理數據但是函數的可移植性沒有SQL強。 11.2使用函數 11.2.1文本處理函數 輸入&#xff1a; SELECT vend_name,UPPER(vend_name) AS vend_name_upcase FROM vendors ORDER BY vend_name; 輸出&#xff1a; 說明&#…

認識vue中的install和使用場景

寫在前面 install 在實際開發中如果你只是一個簡單的業務實現者&#xff0c;那么大部分時間你是用不到install的&#xff0c;因為你用到的基本上都是別人封裝好的插件、組件、方法、指令等等&#xff0c;但是如果你需要給公司的架構做建設&#xff0c;install就是你避不開的一個…

【SpringCloud】構建分布式系統的利器

一、引言 在當今數字化時代&#xff0c;隨著業務規模的不斷擴大和用戶量的急劇增長&#xff0c;單體應用逐漸暴露出諸多局限性&#xff0c;如可擴展性差、維護困難等。分布式系統應運而生&#xff0c;而 Spring Cloud 則成為了構建分布式系統的熱門框架之一。它提供了一系列豐…

mkdir通配符詳解

在 mkdir 命令中使用通配符可以簡化批量創建目錄的操作。通配符如 {} 和 * 可以用來生成多個目錄名稱&#xff0c;從而減少重復輸入。以下是一些常見的使用方法和示例。 使用 {} 通配符 {} 通配符可以用來生成一系列的目錄名稱&#xff0c;語法如下&#xff1a; mkdir dir_{…

Transformer的Word Embedding

一、Transformer 中的詞嵌入是什么&#xff1f; 1. 定義與作用 ? 詞嵌入&#xff08;Word Embedding&#xff09;&#xff1a;將離散的詞語映射為低維連續向量&#xff0c;捕捉語義和語法信息。 ? 在 Transformer 中的位置&#xff1a; ? 輸入層&#xff1a;每個詞通過嵌入…

Linux 進程間通信:信號機制

Linux 進程間通信&#xff1a;信號機制 在多進程操作系統中&#xff0c;進程之間的通信至關重要&#xff0c;尤其是在Linux系統中&#xff0c;信號&#xff08;Signal&#xff09;作為一種特殊的進程間通信方式&#xff0c;廣泛用于進程之間的協調和控制。信號可以看作是操作系…

基于TRIZ創新方法論的九屏法分析系統

1. 文件頭與庫導入 # -*- coding: utf-8 -*- import streamlit as st import pandas as pd import numpy as np import plotly.graph_objects as go from datetime import datetime from sklearn.ensemble import RandomForestRegressor ??作用??&#xff1a;設置文件編碼…

【LangChain框架組成】 LangChain 技術棧的模塊化架構解析

目錄 整體架構概述 整體架構層級劃分 模塊詳細解析 1. 部署與服務層&#xff08;LangServe & Deployments&#xff09; 2. 應用模板層&#xff08;Templates & Committee Architectures&#xff09; 3. 核心功能層&#xff08;LangChain&#xff09; 4. 社區擴展…

自定義數據結構的QVariant序列化 ASSERT failure in QVariant::save: “invalid type to save“

自定義數據結構放入QVariant&#xff0c;在序列化時拋出異常 ASSERT failure in QVariant::save: “invalid type to save” 自定義數據結構如struct MyData&#xff0c;除了要在結構體后面加 struct MyData { ... } Q_DECLARE_METATYPE(MyData)如果需要用到流的輸入輸出&…

vxe-table 啟用 checkbox-config.reserve 實現分頁復選框選擇功能、獲取已選數據的用法

vxe-table 啟用 checkbox-config.reserve 實現分頁復選框選擇功能、獲取已選數據的用法 查看官網&#xff1a;https://vxetable.cn gitbub&#xff1a;https://github.com/x-extends/vxe-table gitee&#xff1a;https://gitee.com/x-extends/vxe-table 效果 代碼 獲取已選擇…

藍橋杯-門牌制作

題目描述 本題為填空題&#xff0c;只需要算出結果后&#xff0c;在代碼中使用輸出語句將所填結果輸出即可。 小藍要為一條街的住戶制作門牌號。 這條街一共有 20202020 位住戶&#xff0c;門牌號從 11 到 20202020 編號。 小藍制作門牌的方法是先制作 00 到 99 這幾個數字…

C#調用Lua方法1+C#調用Lua方法2,3

xLua中Lua調用C#代碼 原因&#xff1a;C#實現的系統&#xff0c;因為Lua可以調用&#xff0c;所以完全可以換成Lua實現&#xff0c;因為Lua可以即時更改&#xff0c;即時運行&#xff0c;所以游戲的代碼邏輯就可以隨時更改。 實現和C#相同效果的系統&#xff0c;如何實現&#…

macOS Chrome - 打開開發者工具,設置 Local storage

文章目錄 macOS Chrome - 打開開發者工具設置 Local storage macOS Chrome - 打開開發者工具 方式2&#xff1a;右鍵點擊網頁&#xff0c;選擇 檢查 設置 Local storage 選擇要設置的 url&#xff0c;顯示右側面板 雙擊面板&#xff0c;輸入要添加的內容 2025-04-08&#xff…