消息隊列生產者投遞的高可靠性與一致性保障方案

在構建高可靠分布式系統時,確保業務數據庫與消息隊列(MQ)之間的一致性是一項核心挑戰。尤其當使用 Kafka 作為消息隊列中間件時,如何避免“數據庫寫入成功,但消息發送失敗”或“消息重復發送”等問題,成為系統架構必須解決的問題。

本文通過本地持久化 + 異步補償 + 冪等性控制,建立一套穩定、可觀測、可容災的消息保障機制。從設計與實現兩個角度保障生產者端消息不丟失


一、Kafka 客戶端與服務端配置

為保障 Kafka 消息可靠性,需對客戶端與服務端分別進行關鍵參數配置。

1、Kafka 客戶端配置(Producer)

參數配置項推薦值說明
acksall等待所有副本確認,確保寫入可靠性
enable.idempotencetrue開啟冪等性保障,避免重復投遞
retries10 或更大出現暫時性異常時自動重試
transactional.id必填(示例:tx-001開啟事務消息發送功能,唯一標識
max.in.flight.requests.per.connection1~5(強烈推薦不超過5)控制并發發送請求數量,配合冪等性使用,避免亂序

2、Kafka 服務端配置(Broker)

參數配置項推薦值說明
replication.factor3消息副本數,保障持久化可靠性
min.insync.replicas2寫入至少需要的活躍副本數
unclean.leader.election.enablefalse禁止選舉未同步的副本作為 leader,防止數據丟失

二、Java 程序端控制邏輯

為實現最終一致性,Kafka 消息發送與數據庫操作解耦,并通過本地持久化文件中轉,采用“同步寫業務 + 異步投遞消息”的策略。目錄結構設計如下:

1、文件目錄結構

目錄用途說明
tmp/臨時目錄,數據庫事務提交前的消息文件
pending/已提交數據庫事務,待異步發送消息
sending/正在處理中的消息
success/發送成功的消息文件
failed/超過最大重試次數的失敗消息文件

2、生成本地消息文件(同步流程)

此流程在主業務線程中執行,確保在數據庫操作成功的前提下生成消息。

2.1、開啟數據庫事務

  • 啟動數據庫事務,確保業務數據變更與消息生成的原子性。

2.2、執行業務邏輯 + 寫入臨時消息文件

  • 執行數據庫 insert/update 等操作。
  • 同時將待發 Kafka 消息內容寫入 tmp/ 目錄。

2.3、提交數據庫事務

  • 數據庫操作無異常,提交事務,確保業務數據持久化。

2.4、原子移動文件至 pending/

  • tmp/ 文件原子性移動至 pending/,避免處理未完成數據。

3、異步掃描并發送 Kafka 消息(異步流程)

異步線程或定時任務不斷掃描 pending/ 目錄,處理待發消息,確保最終一致性。

3.1、準備階段

a. 掃描 pending/ 目錄,按時間順序選取文件。
b. 原子性將文件移動至 sending/,鎖定處理權限。
c. 讀取文件內容,提取 messageId、topic 等。

3.2、預校驗階段

a. 檢查重試次數是否超限

  • 若超限,文件移動至 failed/,記錄失敗信息。
  • 若未超限,繼續后續流程。

b. 執行冪等性判斷

  • 若 messageId 已被處理,直接將文件移動至 success/,跳過投遞。
  • 否則,繼續發送。

3.3、Kafka 消息發送階段

a. 開啟 Kafka 事務(KafkaProducer.beginTransaction)

b. 執行 send 操作將消息發送到 Kafka

c. 若成功,提交事務(KafkaProducer.commitTransaction)

3.4、狀態持久化階段

a. 發送成功后,將文件從 sending/ 移動至 success/,歸檔處理。

b. 若發送失敗,Kafka 回滾事務,并記錄重試次數,待下輪重試。


三、人工定期巡檢機制

為進一步提升系統穩定性與可觀測性,建議運維或監控團隊定期檢查以下目錄狀態:

檢查對象檢查內容說明
pending/是否存在長時間未處理的消息文件
sending/是否存在卡死、長時間未移動的消息文件
failed/是否出現大量失敗文件,需分析失敗原因
磁盤容量監控磁盤是否存滿,避免寫入失敗
文件異常格式是否存在不完整或格式異常的消息文件

可配合 ELK、Prometheus、Grafana 等工具,實時采集告警指標。


四、方案選型解析

為什么選擇本地文件作為中間狀態存儲?

對比落數據庫消息表落本地文件
寫入性能網絡 + SQL + I/O,慢本地寫入,極快(一次磁盤IO操作)
系統解耦耦合數據庫事務解耦業務邏輯
容錯能力依賴數據庫高可用磁盤寫入可恢復
恢復能力數據難提取排查文件可查、易追蹤

結論: 本地文件方案具備更高的吞吐、更小的耦合度和更強的可控性,更適合用于消息可靠性極致要求場景


五、容錯機制總結表

異常場景處理機制
數據庫事務失敗臨時文件未移動,消息不會被投遞
寫入本地文件失敗事務未提交,整體失敗
Kafka send 異常Kafka事務回滾,重試
Kafka事務提交失敗消息文件未進入 success,重試
異步線程宕機任務下次自動拉起時繼續掃描處理
機器宕機文件持久化保存,重啟后自動恢復
達到重試上限進入 failed/,等待人工干預

六、總結

本方案以本地文件系統為核心緩沖機制,結合 Kafka 原生事務、冪等性保障機制及 Java 程序控制能力,實現了生產端消息“必達”保障體系。具備如下特性:

  • 強一致性保障:業務與消息兩階段提交,天然避免消息丟失
  • 最終一致性:異步重試機制 + Kafka事務補償
  • 穩定可靠性:本地磁盤可控性強,適合高并發大流量
  • 可擴展可觀測:異步線程、人工巡檢、狀態文件清晰明了

可廣泛應用于 金融、訂單、庫存、電商、支付等高可靠性場景

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

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

相關文章

Formality:Bug記錄

相關閱讀 Formalityhttps://blog.csdn.net/weixin_45791458/category_12841971.html?spm1001.2014.3001.5482 本文記錄博主在使用Synopsys的形式驗證工具Formality中遇到的一個Bug。 Bug復現 情況一 // 例1 module dff (input clk, input d_in, output d_out …

通信算法之267 : DJI無人機 云哨 DroneID 640ms

DJI 無人機 與DroneID 轉 *** 載 0x01 摘要 消費級無人機可以用于高級航拍、物流和人道主義救援等等。但是其廣泛使用給安全、安保和隱私帶來了許多風險。例如,攻擊方可能會使用無人機進行監視、運輸非法物品,或通過侵入機場上方的封閉空域造成經濟損…

論壇測試報告

作者前言 🎂 ??????🍧🍧🍧🍧🍧🍧🍧🎂 ?🎂 作者介紹: 🎂🎂 🎂 🎉🎉&#x1f389…

npx 的作用以及延伸知識(.bin目錄,npm run xx 執行)

文章目錄 前言原理解析1. npx 的作用2. 為什么會有 node_modules/.bin/lerna3. npx 的查找順序4. 執行流程總結1: 1. .bin 機制什么是 node_modules/.bin?例子 2. npx 的底層實現npx 是如何工作的?為什么推薦用 npx?npx 的特殊能力…

【c語言】深入理解指針3——回調函數

一、回調函數 回調函數:通過函數指針調用的函數. 當把一個函數的地址傳遞給另一個函數,通過該地址去調用其指向的函數,那么這個被調用的函數就是回調函數. 示例: 在【深入理解指針2】中結尾寫了用函數指針實現計算器的功能&#…

HTTP 核心概念

🧑 博主簡介:CSDN博客專家,歷代文學網(PC端可以訪問:https://literature.sinhy.com/#/literature?__c1000,移動端可微信小程序搜索“歷代文學”)總架構師,15年工作經驗,…

VidBot:從野外 2D 人體視頻中學習可泛化的 3D 動作,實現零樣本機器人操控

25年3月來自慕尼黑工大、瑞士 ETH 和微軟的論文“VidBot: Learning Generalizable 3D Actions from In-the-Wild 2D Human Videos for Zero-Shot Robotic Manipulation”。 未來的機器人被設想為能夠執行各種家務的多功能系統。最大的問題仍然是,如何在盡量減少機器…

Linux 日常運維命令大全

Linux 作為一種開源操作系統,在服務器運維中扮演著重要角色。掌握常用的 Linux 命令對于運維人員而言至關重要。本文將整理一份 Linux 服務器運維常用命令大全,幫助你在日常工作中提高效率和準確性。 1. 基礎命令 基礎命令是Linux操作的起點&#xff0…

編程規范之枚舉

編程規范之枚舉 1.1 初始化枚舉項 枚舉平時用的也沒有很頻繁,今天看代碼規范提到枚舉類型初始化枚舉項。并對初始化枚舉項進行了歸納。包括下面三個 不進行顯示初始化,交由編譯器完成。 對第一個枚舉項的顯式初始化,這樣可以強制整數值的…

《軟件設計師》復習筆記(12.1)——范圍管理、進度管理

目錄 一、范圍管理 1. 核心概念 2. 范圍管理過程 WBS(工作分解結構)示例 真題示例: 二、進度管理 1. 核心過程 2. 關鍵工具與技術 真題示例: 一、范圍管理 1. 核心概念 項目范圍:為交付產品必須完成的工作…

過去十年前端框架演變與技術驅動因素剖析

一、技術演進脈絡(2013-2023) 2013-2015:結構化需求催生框架雛形 早期的jQuery雖然解決了跨瀏覽器兼容性問題(如IE8兼容性處理),但其松散的代碼組織方式難以支撐復雜應用開發。Backbone.js的出現首次引入M…

中華傳承-醫山命相卜-梅花易數

梅花易數 靈活起卦(如數字、聲音、外應等)和象數結合,準確率可達96.8%。其起卦方式擺脫傳統龜殼、蓍草的繁瑣,強調直覺與靈活性。 個人決策、事件預測等 尤其在短期、具體問題上表現突出。

如何用Brower Use WebUI實現網頁數據智能抓取與分析?

作者:算力魔方創始人/英特爾創新大使劉力 Browser-use是一款能讓AI智能體像人類一樣操作網頁的創新工具,與傳統網絡爬蟲技術相比,Browser-use能模擬人瀏覽并操作網頁,在采集網站數據時,不會被網站反爬機制識別和封禁&…

LIMS引領綜合質檢中心數字化變革,賦能質量強國戰略

在質量強國戰略的深入推進下,我國綜合質檢機構迎來了前所未有的發展機遇,同時也面臨著諸多嚴峻挑戰。隨著檢測領域從傳統的食品藥品監督向環境監測、新材料檢測等新興領域不斷拓展,跨領域協同管理的復雜度呈指數級增長。作為提升產品質量的關…

簡單好用的在線工具

用AI寫了一些在線工具,簡介好用,推薦給大家,歡迎大家使用并提議意見。 網址:https://www.bittygarden.com/ 目前已有以下功能: MD5SM3SHAUnicode 編碼Unicode 解碼Base32 編碼Base32 解碼Base64 編碼Base64 解碼URL …

阿里云服務器搭建開源版禪道

一,下載地址:禪道11.5版本發布,主要完善細節,修復bug,新增動態過濾機制 - 禪道下載 - 禪道項目管理軟件 下載地址二: 禪道21.6.stable 實現舊編輯器撰寫的文檔無感升級至新版編輯器 - 禪道下載 - 禪道項目…

leetcode 309. Best Time to Buy and Sell Stock with Cooldown

目錄 題目描述 第一步,明確并理解dp數組及下標的含義 第二步,分析并理解遞推公式 1.求dp[i][0] 2.求dp[i][1] 3.求dp[i][2] 第三步,理解dp數組如何初始化 第四步,理解遍歷順序 代碼 題目描述 這道題與第122題的區別就是賣…

嵌入式硬件常用總線接口知識體系總結和對比

0.前言 在嵌入式工程實現中,多多少少我們都使用過總線,各種各樣的總線應用于不同場合,不同場景有不同的優勢,但是我們在作為工程師過程中在如何選擇項目合適的總線,根據什么來選?需要我們對項目全局和總線特征有所了解,本文目的就是對比多種總線的關鍵特征 我們在聊到…

數據分析處理庫Pandas常用方法匯總

目錄 一、基礎操作 1.1 創建df對象 1.1.1 讀入表格數據 1.1.2 手動創建df 1.2 .info() 1.3 df.index 1.4 df.columns 1.5 df.dtypes 1.6 df.values 1.7 .set_index() 1.8 df[xxx] 1.9 .describe() 1.10 .isin() 1.12 .where() 1.13 .query() 1.14 Series類型運算…

智慧大屏系統

延凡智慧大屏系統旨在打破數據壁壘,將海量、復雜的數據轉化為直觀易懂的可視化圖形和信息,廣泛應用于城市管理、企業運營、交通指揮、能源監控等多個領域,為管理者、決策者提供全面、實時、精準的信息展示和分析工具,助力高效決策…