Kafka的無消息丟失配置怎么實現

那 Kafka 到底在什么情況下才能保證消息不丟失呢?

Kafka 只對“已提交”的消息(committed message)做有限度的持久化保證。

? ? 第一個核心要素是“已提交的消息”。什么是已提交的消息?當 Kafka 的若干個 Broker 成

功地接收到一條消息并寫入到日志文件后,它們會告訴生產者程序這條消息已成功提交。此

時,這條消息在 Kafka 看來就正式變為“已提交”消息了。

? ? 那為什么是若干個 Broker 呢?這取決于你對“已提交”的定義。你可以選擇只要有一個

Broker 成功保存該消息就算是已提交,也可以是令所有 Broker 都成功保存該消息才算是

已提交。不論哪種情況,Kafka 只對已提交的消息做持久化保證這件事情是不變的。

? ? 第二個核心要素就是“有限度的持久化保證”,也就是說 Kafka 不可能保證在任何情況下

都做到不丟失消息。舉個極端點的例子,如果地球都不存在了,Kafka 還能保存任何消息

嗎?顯然不能!倘若這種情況下你依然還想要 Kafka 不丟消息,那么只能在別的星球部署

Kafka Broker 服務器了。

? ? 現在你應該能夠稍微體會出這里的“有限度”的含義了吧,其實就是說 Kafka 不丟消息是

有前提條件的。假如你的消息保存在 N 個 Kafka Broker 上,那么這個前提條件就是這 N

個 Broker 中至少有 1 個存活。只要這個條件成立,Kafka 就能保證你的這條消息永遠不會

丟失。

? ? ?總結一下,Kafka 是能做到不丟失消息的,只不過這些消息必須是已提交的消息,而且還要

滿足一定的條件。當然,說明這件事并不是要為 Kafka 推卸責任,而是為了在出現該類問

題時我們能夠明確責任邊界。

最佳實踐

  • 不要使用 producer.send(msg),而要使用 producer.send(msg, callback)。記住,一

定要使用帶有回調通知的 send 方法。

  • ?設置 acks = all。acks 是 Producer 的一個參數,代表了你對“已提交”消息的定義。

如果設置成 all,則表明所有副本 Broker 都要接收到消息,該消息才算是“已提交”。

這是最高等級的“已提交”定義。

  • ?設置 retries 為一個較大的值。這里的 retries 同樣是 Producer 的參數,對應前面提到

的 Producer 自動重試。當出現網絡的瞬時抖動時,消息發送可能會失敗,此時配置了retries > 0 的 Producer 能夠自動重試消息發送,避免消息丟失。

  • 設置 unclean.leader.election.enable = false。這是 Broker 端的參數,它控制的是哪

些 Broker 有資格競選分區的 Leader。如果一個 Broker 落后原先的 Leader 太多,那么

它一旦成為新的 Leader,必然會造成消息的丟失。故一般都要將該參數設置成 false,

即不允許這種情況的發生。

  • 設置 replication.factor >= 3。這也是 Broker 端的參數。其實這里想表述的是,最好將

消息多保存幾份,畢竟目前防止消息丟失的主要機制就是冗余。

6. 設置 min.insync.replicas > 1。這依然是 Broker 端參數,控制的是消息至少要被寫入

到多少個副本才算是“已提交”。設置成大于 1 可以提升消息持久性。在實際環境中千

萬不要使用默認值 1。

  • 確保 replication.factor > min.insync.replicas。如果兩者相等,那么只要有一個副本掛

機,整個分區就無法正常工作了。我們不僅要改善消息的持久性,防止數據丟失,還要

在不降低可用性的基礎上完成。推薦設置成 replication.factor = min.insync.replicas +

1。

  • 確保消息消費完成再提交。Consumer 端有個參數 enable.auto.commit,最好把它設

置成 false,并采用手動提交位移的方式。就像前面說的,這對于單 Consumer 多線程

處理的場景而言是至關重要的。


推薦閱讀

  • 事件風暴在DDD中的應用
  • 網關層數據脫敏
  • 建立估算軟件開發工作量的方法

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

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

相關文章

集成CommitLInt+ESLint+Prettier+StyleLint+LintStaged

代碼可讀性低代碼 代碼規范落地難代碼格式難統一代碼質量低下 配置 ESLint ESLint 是一個用來識別 ECMAScript 并且按照規則給出報告的代碼檢測工具,使用它可以避免低級錯誤和統一代碼的風格。它擁有以下功能: 查出 JavaScript 代碼語法問題。根據配置…

尋找兩個正序數組的中位數(C++)

給定兩個大小分別為 m 和 n 的正序(從小到大)數組 nums1 和 nums2。請你找出并返回這兩個正序數組的 中位數 。算法的時間復雜度應該為 O(log (mn)) 。示例 1:輸入:nums1 [1,3], nums2 [2] 輸出:2.00000 解釋&#x…

Expected Sarsa 算法的數學原理

🌟 一、Expected Sarsa 算法的數學原理 1. 什么是 Expected Sarsa? Expected Sarsa 是一種基于 時序差分(Temporal Difference, TD)學習 的強化學習算法,用于估計 動作值函數 ( q_{\pi}(s, a) )。它是 Sarsa 算法的一種…

Vue的watch和React的useEffect

參考文章:https://zhuanlan.zhihu.com/p/686329898

idea中合并git分支

1.把本地dev代碼合并到本地master代碼在提交代碼之前,先確保dev和master都拉取了最新的代碼都進行了Git->pull了這時候確保Local的第一個分支是master分支,然后選擇dev分支 ,鼠標右鍵-》Merge dev into master這時候會提示 有合并到本地master最新的代…

《Spring 中上下文傳遞的那些事兒》Part 7:異步任務上下文丟失問題詳解

📝 Part 7:異步任務上下文丟失問題詳解 在現代 Java 應用中,異步編程已經成為提升性能、解耦業務邏輯的重要手段。無論是使用 CompletableFuture、線程池(ExecutorService)、定時任務(ScheduledExecutorSe…

大語言模型驅動智能語音應答:技術演進與架構革新

在智能客服、電話銀行等場景中,用戶時常遇到這樣的困境:“請描述您的問題...抱歉沒聽清,請重試...正在為您轉接人工”。傳統語音應答(IVR)系統受限于規則引擎與淺層語義理解,難以應對復雜多變的自然語言表達…

【Linux】內存管理

要求:1、編寫程序,實現如下功能。(1)隨機生成 1000000 個 0~1 之間的數;(2)統計分析這些數據,計算均值、方差和分布情況,分布情況按0.01 的步長進行統計;&…

蒼穹外賣—day1

文章目錄前言一、接口文檔導入與生成二、前端環境搭建三、后端環境搭建1. 了解項目結構2. 環境搭建常見問題總結前言 (簡要說明筆記的目的:記錄搭建過程、關鍵配置和結構理解) 一、接口文檔導入與生成 Apifox 導入 使用工具:https…

基于微信小程序的在線疫苗預約小程序源碼+論文

基于微信小程序的在線疫苗預約系統源碼論文代碼可以查看文章末尾??聯系方式獲取,記得注明來意哦~🌹 分享萬套開題報告任務書答辯PPT模板 作者完整代碼目錄供你選擇: 《SpringBoot網站項目》800套 《SSM網站項目》1200套 《小程序項目》600套…

Windows 11 安裝過程中跳過微軟賬戶創建本地賬戶

背景 在 Windows 11 的安裝和設置過程中,Microsoft 賬號登錄是默認的認證方式。然而,在某些情況下,可能需要繞過此步驟以創建本地賬戶。 微軟在 2025 年 3 月推送的 Windows 11 預覽版(Build 26120.3653 和 Build 26200.5516&am…

利用DBeaver實現異構數據庫數據定時任務同步

1、背景 本需求需要實現抽取KingBaseEs數據庫的某幾張表數據,定時同步到MySQL中 2、工具準備 2.1 DBeaverEE25.1(必須要企業版,如果用社區版沒有定時任務功能) https://dbeaver.io/download/ 2.2 KingBaseEs數據庫及驅動 https://www.kingbase.com…

【TCP/IP】1. 概述

1. 概述1. 概述1.1 因特網及技術催生新時代1.1.1 信息化時代1.1.2 關鍵技術1.1.3 國家戰略1.2 網絡互聯的動機和技術1.2.1 網絡互聯的動機1.2.2 網絡互聯技術1.3 因特網的形成和發展1.3.1 國際因特網發展軌跡1.3.2 中國互聯網發展1.4 有關因特網的組織機構1.5 請求注解&#xf…

中老年人的陪伴,貓咪與機器人玩具有什么區別?

在人口結構深度老齡化的背景下,中老年群體的精神需求與情感陪伴已成為重要的社會議題。貓咪作為活生生的伴侶動物,與日新月異的智能陪伴機器人,代表了兩種截然不同的情感慰藉路徑——前者承載著生命互動的溫度與責任,后者則彰顯了…

day11-微服務面試篇

微服務在面試時被問到的內容相對較少,常見的面試題如下:SpringCloud有哪些常用組件?分別是什么作用?服務注冊發現的基本流程是怎樣的?Eureka和Nacos有哪些區別?Nacos的分級存儲模型是什么意思?R…

昇騰 k8s vnpu配置

參考文檔: https://www.hiascend.com/document/detail/zh/mindx-dl/500/AVI/cpaug/cpaug_018.html 此文檔實現為NPU910B3卡 主機設置靜態虛擬npu 設置虛擬化模式 !本命令只支持再物理機執行,取值為0或1,(如果是在虛擬機內劃分vNPU…

Redis常用數據結構以及多并發場景下的使用分析:Set類型

文章目錄前言redis中的set結構疑問1 :為什么使用數組后 整體時間復雜度還是O(1)疑問2: set特性是無序的那為什么當元素少的時候 用連續數組 去存儲呢?疑問3:當元素少于512的時候即使用intset存儲的時候 是如何維護唯一性的&#x…

Linux中rw-rw-r--相關的訪問權限講解

下面就是關于 rw-rw-r-- 的知識圖譜式講解。核心節點:rw-rw-r-- (文件權限表示法) 這是一個在 Linux/Unix 操作系統中,通過 ls -l 命令查看到的,用于描述文件或目錄訪問權限的10字符字符串。分支一:字符串的解剖 (Anatomy of the …

C#異常處理:更優雅的方式

C#異常處理:更優雅的方式 在 C# 編程的世界里,異常處理是繞不開的重要環節。程序運行時難免會出現各種意外,若處理不當,可能導致程序崩潰,給用戶帶來糟糕體驗。所以,掌握更優雅的異常處理方式,對…

Qt6中模態與非模態對話框區別

一.阻塞 vs 非阻塞1.模態對話框阻塞父窗口:打開后,用戶必須先處理該對話框(關閉或完成操作),才能繼續操作父窗口。應用場景:強制用戶立即響應的場景,如確認對話框、登錄窗口、文件選擇器等。2.非…