【消息队列】kafka如何保证消息不丢失?

👏大家好!我是和风coding,希望我的文章能给你带来帮助!
🔥如果感觉博主的文章还不错的话,请👍三连支持👍一下博主哦
📝点击 我的主页 还可以看到和风的其他内容噢,更多内容等你来探索!
📕欢迎参观我的个人网站:Gentlewind

文章目录
- kafka 的架构
- 消息语义传递
- Producer
- Broker
- Consumer
kafka 的架构
kafka 的架构非常简洁,主要是分布式架构,由 Producer、Broker、Consumer 组成。
🔊所以分析丢失的场景也会由这三部分来进行。
从 Kafka 整体架构图我们可以得出有三次消息传递的过程:
1)Producer 端发送消息给 Broker 端。
2)Broker 将消息进行同步并持久化数据。
3)Consumer 端从 Broker 将消息拉取并进行消费。
消息语义传递
首先我们先了解一下保证消息传递的一个通信模型:消息语义传递
他有三个类型:
- At Most Once(最多一次):消息在传递过程中最多被传递一次。也就是说消息可能会丢失,但不会重复传递
- At Least Once(至少一次):消息在传递中至少传递一次。也就是消息不会丢失,但可能重复传递
- Exactly Once(恰好一次):也就是精确的传递一次。既不丢失,也不重复传递
我们需要**根据具体的场景,选择需要的传递类型。**比如对消息丢失不能忍受,但是可以接收消息重复传递,就可以选择第二种类型。
然后再根据需求来对 kafka 进行相应的配置。就类似于 CAP 理论,这是一个取舍问题。
Producer
Producer 端发送消息到 Broker 端,消息丢失的情况可能会有:
- 网络波动导致消息没有发送到 Broker
- 发送途中 Broker 宕机了
- 消息太大超过了 Broker 的容量被拒收了
总结:丢失的原因就是消息根本没有发送到 broker 端
拓展:Producer 端为了提升发送效率,减少IO操作,发送数据的时候是将多个请求合并成一个个 RecordBatch,并将其封装转换成 Request 请求「异步」将数据发送出去(也可以按时间间隔方式,达到时间间隔自动发送)
解决方案:
- ACK 机制
可以通过配置 ack 来对消息进行确认,进而保证消息不丢失。
具体 ack 的配置为:
acks = 0:不进行确认,也就是实现第一种类型acks = 1:消息发送到 broker 的分区后进行一次 ack 确认,确认接收成功后就完成了。但是它只保证了发送消息到主分区。如果从分区还没有同步完数据而主分区宕掉了,就会造成丢数据。acks = all:对所有的主从分区进行 ack 确认,都成功接收消息才完成。这样的可靠性最高,但是相应的吞吐率也会更低。
其实就是同步的方式,Producer要保证消息到达服务器,就需要使用到消息确认机制,也就是说,必须要确保消息投递到服务端,并且得到投递成功的响应,确认服务器已接收,才会继续往下执行。
Broker
kafka 中,broker 接收到消息会先存放在 Pagecache (缓存)中,然后通过批量异步刷盘的策略来对数据进行同步和持久化。
Broker 将消息进行同步并持久化数据。消息丢失的情况有:
- 当刷盘之前 broker 宕掉了,然后推举出了一个落后数据的从分区。那么之前的数据就丢失了
解决方案:
- 同步刷盘:可以通过一些配置实现同步刷盘,可以保证消息不丢失,这样就算失败,也可以进行及时补偿。
# 当达到下面的消息数量时,会将数据flush到日志文件中。默认10000
#log.flush.interval.messages=10000
# 当达到下面的时间(ms)时,执行一次强制的flush操作。interval.ms和interval.messages无论哪个达到,都会flush。默认3000ms
#log.flush.interval.ms=1000
# 检查是否需要将日志flush的时间间隔
log.flush.scheduler.interval.ms = 3000
同样可以达到同步刷盘的效果。
- kafka 默认通过「**多 Partition (分区)多 Replica(副本)机制」**已经可以最大限度的保证数据不丢失,如果数据已经写入 PageCache 中但是还没来得及刷写到磁盘,此时如果所在 Broker 突然宕机挂掉或者停电,极端情况还是会造成数据丢失。
Consumer
Consumer 消费消息有两个步骤:
- 从 broker 中拉取消息
- 处理消息,然后标记消息已经消费并提交 offset 记录(消息位移记录),下次继续消费的时候,会接着上次的offset进行消费。
那么 Consumer 端从Broker 将消息拉取并进行消费,可能丢失的场景有:
-
开启了自动提交,如果开启了自动提交,那么系统会自动进行提交offset。可能会引起,并未消费掉,就提交了offset.引起数据的丢失。
-
并且自动提交也分两种情况:
-
-
拉取消息后「先提交 Offset,后处理消息」,如果此时处理消息的时候异常宕机,由于 Offset 已经提交了, 待 Consumer 重启后,会从之前已提交的 Offset 下一个位置重新开始消费, 之前未处理完成消息不会被再次处理,对于该 Consumer 来说消息就丢失了。
-
拉取消息后「先处理消息,在进行提交 Offset」, 如果此时在提交之前发生异常宕机,由于没有提交成功 Offset, 待下次 Consumer 重启后还会从上次的 Offset 重新拉取消息,不会出现消息丢失的情况, 但是会出现重复消费的情况,这里只能业务自己保证幂等性。
-
解决方案:
设置参数enable.auto.commit = false, 采用手动提交位移的方式。这样如果消费失败的情况下,我们可以不断地进行重试。所以,消费端不要设置自动提交,一定设置为手动提交才能保证消息不丢失。而幂等的问题可以在业务逻辑中进行判断。
相关文章:
【消息队列】kafka如何保证消息不丢失?
👏大家好!我是和风coding,希望我的文章能给你带来帮助! 🔥如果感觉博主的文章还不错的话,请👍三连支持👍一下博主哦 📝点击 我的主页 还可以看到和风的其他内容噢&#x…...
不同随机数生成的含义
torch.manual_seed(all_args.seed) torch.cuda.manual_seed(all_args.seed) torch.cuda.manual_seed_all(all_args.seed) np.random.seed(all_args.seed) random.seed(all_args.seed) 这几种随机种子设置的含义如下: torch.manual_seed(all_args.seed): 设置PyTor…...
Jar工具完全指南:从入门到精通
Jar工具完全指南:从入门到精通的详尽教程 前言 欢迎来到Jar工具的完全指南!无论你是Java编程的初学者,还是经验丰富的开发者,掌握Jar工具都是必不可少的。Jar(Java Archive)是Java生态系统中的一个核心组…...
前端使用docx-preview展示docx + 后端doc转docx
文章目录 后端 doc 转 docxdcox - preview安装导入使用注意 最近菜鸟刚搞完签字,结果需求就加了,如果合同有附件(.doc.docx),签名就是签到附件里面,没有附件才是签到那个html里面! 这里附件签名…...
Vue3 组件通信
目录 create-vue创建项目 一. 父子通信 1. 父传子 2. 子传父 二. 模版引用(通过ref获取实例对象) 1.基本使用 2.defineExpose 三. 跨层通信 - provide和inject 1. 作用和场景 2. 跨层传递普通数据 3. 跨层传递响应式数据 4. 跨层传递方法 create-vue创建项目 npm ini…...
如何在Ubuntu 14.04上安装、配置和部署Rocket.Chat
前些天发现了一个巨牛的人工智能学习网站,通俗易懂,风趣幽默,忍不住分享一下给大家。点击跳转到网站。 简介 Rocket.Chat 是一个使用 Meteor 构建的开源消息应用程序。它支持视频会议、文件共享、语音消息,具有完整的 API 等功能…...
ISO 26262中的失效率计算:IEC TR 62380-Section 15-Switches and keyboards
目录 概要 1 开关和键盘的分类 2 开关和键盘失效率的计算 2.1 Switches and keyboards 2.1.1 Base失效率 2.1.2 接触数量 2.1.3 温度循环De-rating系数 概要 IEC TR 62380《电子组件、PCBs和设备的可靠性预计通用模型》是涵盖电路、半导体分立器件、光电组件、电阻器、电…...
Linux安全与高级应用(五)深入探讨Linux Shell脚本应用:从基础到高级
文章目录 深入探讨Linux Shell脚本应用:从基础到高级引言一、Shell脚本基础知识1. Shell的作用与分类2. 编写第一个Shell脚本 二、Shell变量的使用1. 变量的类型与定义2. 引号的使用3. 位置变量与预定义变量 三、重定向与管道操作1. 重定向操作2. 管道操作 四、计划…...
Java中等题-解码方法(力扣)
一条包含字母 A-Z 的消息通过以下映射进行了 编码 : "1" -> A "2" -> B ... "25" -> Y "26" -> Z 然而,在 解码 已编码的消息时,你意识到有许多不同的方式来解码,因为有些…...
【Git】git 从入门到实战系列(二)—— Git 介绍以及安装方法
文章目录 一、前言二、git 是什么三、版本控制系统是什么四、本地 vs 集中式 vs 分布式本地版本控制系统集中式版本控制系统分布式版本控制系统 五、安装 git 一、前言 本系列上一篇文章【Git】git 从入门到实战系列(一)—— Git 的诞生,Lin…...
【QT 5 QT 6 构建工具qmake-cmake-和-软件编译器MSVCxxxvs MinGWxxx说明】
【QT 5报错:/xxx/: error: ‘class Ui::frmMain’ has no member named ‘xxx’-和-软件编译器MSVCxxxvs MinGWxxx说明】 1、前言2 、qt 中 Qmake CMake 和 QBS1-qmake2-Cmake3-QBS4-官网一些说法5-各自特点 3、软件编译套件1-Desktop Qt 6.7.2 llvm-mingw 64-bit2-…...
SD卡参数错误:深度解析与数之寻软件恢复实战
一、SD卡参数错误:数据与设备的隐形杀手 在数字化时代,SD卡作为便携存储设备,广泛应用于相机、手机、无人机及各类电子设备中,承载着人们珍贵的照片、视频、文档等重要数据。然而,SD卡在使用过程中,有时会…...
深入理解和应用RabbitMQ的Work Queues模型
文章目录 1. 场景模拟2. 消息发送3. 消息接收4. 测试5. 能者多劳6. 总结 当你在处理消息时,可能会遇到这样的问题:消息的生产速度远远大于消费速度,导致消息堆积。这时候,Work Queues(工作队列)模型就能派上…...
嵌入式面试八股文(三)·野指针产生原因和解决方法、指针函数和函数指针的区别
目录 1. 野指针产生原因和解决方法 1.1 产生的原因 1.1.1 指针未能初始化 1.1.2 指针指向的内存被释放 1.1.3 指针指向的对象被重复释放 1.2 解决方法 1.2.1 初始化指针 1.2.2 指针空置 1.2.3 避免悬挂指针 2. 指针函数和函数指针的区别 2.1 定义不同 2…...
OpenCV 中 CV_8UC1,CV_32FC3,CV_32S等参数的含义
在OpenCV中,创建图像时需要指定图像的类型,这些类型通常通过常量来表示,例如 CV_8UC1、CV_32FC3、CV_32S 等。这些常量定义了图像的数据类型和通道数,具体含义如下: CV_8UC1: CV_8U 表示每个像素由一个8位无…...
v 3 + vite + ts 自适应布局(postcss-pxtorem)
1、 当pc端、移动端H5等项目中,需要根据当前浏览器窗口或屏幕尺寸,来自适应的改变页面内元素尺寸时,就可以借助下述插件和相关配置来实现。 2、适用范围:vue3 vite ts 步骤一:相关依赖下载下载相关依赖 npm inst…...
(MTK)java文件添加简单接口并配置相应的SELinux avc 权限笔记2
文章简介 承接上一篇笔记,该份笔记是笔者深思熟虑后根据实战应用所总结出来的精华内容,该文章内容主要包括配置avc权限的使用场景以及其上下环节所需的准备。 使用场景 1.底层驱动有无配置好相应的串口 2.开启相应的selinux avc 权限 3.在framework层配置相应的 (config…...
Linux安全与高级应用(六)Linux Shell脚本编程的高级应用:条件测试与if语句的妙用
文章目录 Linux Shell脚本编程的高级应用:条件测试与if语句的妙用一、条件测试操作详解1. 字符串比较2. 整数比较3. 文件测试4. 逻辑测试 二、if语句的结构与应用1. 单分支结构2. 双分支结构3. 多分支结构 三、实际应用案例1. 需求描述2. 实现思路3. 代码实现4. 设置…...
升级MacOS(Mojave)后使用git问题
将MacOS升级到Mojave版本后,使用git工具时,出现如下错误提示: guochongxindeMacBook-Pro:study guochongxin$ git status . xcrun: error: invalid active developer path (/Library/Developer/CommandLineTools), missing xcrun at: /Librar…...
基于PFC和ECN搭建无损RoCE网络的工作流程分析
无损RoCE网络概念 RDMA(Remote Direct Memory Access,远程直接内存访问)是一种为了解决网络传输中服务器端数据处理延迟而产生的技术。RDMA 将用户应用中的数据直接传入服务器的存储区,通过网络将数据从一个系统快速传输到远程系…...
Nodezator高级widgets使用技巧:提升Python开发效率的10个秘诀
Nodezator高级widgets使用技巧:提升Python开发效率的10个秘诀 【免费下载链接】nodezator A generalist Python node editor 项目地址: https://gitcode.com/gh_mirrors/no/nodezator Nodezator是一款功能强大的Python节点编辑器,它通过直观的可视…...
OpenClaw低成本方案:Qwen3-14B私有镜像替代OpenAI API实战
OpenClaw低成本方案:Qwen3-14B私有镜像替代OpenAI API实战 1. 为什么选择本地模型替代商用API 去年冬天,当我第一次用OpenClaw自动整理全年会议纪要时,看着账单里OpenAI API的消耗记录,手指悬在键盘上半天没敢点"重试"…...
SEO网络推广费用高吗_需要多少年才能收回成本
SEO网络推广费用高吗?需要多少年才能收回成本 在当今数字化经济时代,SEO网络推广已经成为企业提升在线可见度和吸引客户的关键手段。不少企业在决定投资SEO推广时,常常会对“SEO网络推广费用高吗?需要多少年才能收回成本”这一问题感到困惑…...
百川2-13B量化模型提示工程:降低OpenClaw操作失误率
百川2-13B量化模型提示工程:降低OpenClaw操作失误率 1. 问题背景与挑战 去年冬天,当我第一次尝试用OpenClaw自动化整理电脑上积压的半年项目文档时,遭遇了令人崩溃的"AI灾难现场"——这个本该帮我分类归档的助手,把财…...
从零到一:使用blog_demos构建企业级Flink流处理应用的完整指南
从零到一:使用blog_demos构建企业级Flink流处理应用的完整指南 【免费下载链接】blog_demos CSDN博客专家程序员欣宸的github,这里有六百多篇原创文章的详细分类和汇总,以及对应的源码,内容涉及Java、Docker、Kubernetes、DevOPS等…...
解密OpenHarmony设备安全认证:从SPEKE密钥交换到四级证书链的完整流程解析
OpenHarmony设备安全认证体系深度解析:从密钥交换到证书链验证 1. 安全认证架构设计理念 OpenHarmony作为面向全场景的分布式操作系统,其安全认证体系采用分层防御策略,构建了覆盖设备发现、身份认证、数据传输全生命周期的安全防护机制。这套…...
保姆级教程:在Win10上用VMware给Ubuntu虚拟机配置共享文件夹(含重启失效解决方案)
VMware虚拟机共享文件夹配置全指南:从基础配置到疑难解决 在Windows 10主机上使用VMware运行Ubuntu虚拟机进行开发时,共享文件夹功能是提高工作效率的关键。本文将详细介绍如何从零开始配置共享文件夹,并解决常见的"安装按钮灰色"、…...
OpenClaw硬件优化:Qwen2.5-VL-7B在低配设备上的运行技巧
OpenClaw硬件优化:Qwen2.5-VL-7B在低配设备上的运行技巧 1. 为什么要在低配设备上运行OpenClaw? 去年夏天,我在一台2018款MacBook Air(8GB内存)上第一次尝试部署OpenClaw时,系统几乎瞬间卡死。这让我意识…...
Python机器学习sklearn线性模型完整指南:LinearRegression/Ridge/Lasso详细代码注释
机器学习sklearn模型核心API详解:线性回归、岭回归、Lasso全覆盖(详细代码注释)scikit-learn 是 Python 机器学习最常用的库,但很多初学者对各模型的参数含义一知半解。本文系统整理了 sklearn 中线性模型家族(LinearR…...
全网炸了!5亿人用的Axios竟被投毒,你的密钥还保得住吗?
早些时候,聊过 Python 领域那场惊心动魄的供应链攻击。当时我就感叹,虽然我们 JavaScript 开发者对这类套路烂熟于心,但亲眼目睹这种规模的“投毒”还是头一次。然而,属于我们 JS 圈的至暗时刻,终究还是卷土重来了。而…...
