消息队列生产者投递的高可靠性与一致性保障方案

在构建高可靠分布式系统时,确保业务数据库与消息队列(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.mzph.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类型运算…

智慧大屏系统

延凡智慧大屏系统旨在打破数据壁垒,将海量、复杂的数据转化为直观易懂的可视化图形和信息,广泛应用于城市管理、企业运营、交通指挥、能源监控等多个领域,为管理者、决策者提供全面、实时、精准的信息展示和分析工具,助力高效决策…