Kafka的消息传递保证和一致性
![alt](https://img-blog.csdnimg.cn/img_convert/4285c62744d4cf6aea2acf4e2d683f3a.png)
前言
通过前面的文章,相信大家对Kafka
有了一定的了解了,那接下来问题就来了,Kafka既然作为一个分布式的消息队列系统,那它会不会出现消息丢失或者重复消费的情况呢?今天咱们就来一探。
实现机制
Kafka采用了一系列机制来实现消息传递的保证和一致性,关键点:
-
至少一次的消息传递(At Least Once Delivery):Kafka确保消息至少会被传递给消费者一次。生产者写入消息到Kafka时,会等待消息被持久化并复制到ISR中的副本,并返回一个确认(ack)给生产者。只有当所有ISR中的副本都完成了消息的复制后,消息才被认为是提交成功的,生产者才会收到确认。这样可以确保消息的可靠性,但也可能出现消息重复传递的情况。
-
消费者的消费位置(Consumer Offset):消费者在消费消息时,会记录自己的消费位置,即消费者偏移量(consumer offset)。消费者可以将偏移量提交到Kafka,以便在重启或故障恢复后继续消费。Kafka会将消息的偏移量持久化,保证在故障发生时可以对未消费的消息进行重播。
-
消费者组的协调和重平衡(Consumer Group Coordination and Rebalance):Kafka的消费者可以组成一个消费者组,共同消费一个或多个主题的消息。消费者组中的每个消费者负责处理一个或多个分区。当消费者组中的消费者变化时(如新加入消费者、消费者故障等),Kafka会进行消费者组的重平衡,重新分配分区给消费者。重平衡是为了保证每个分区只有一个消费者进行消费,以保证消息的顺序性和一致性。
-
消费者的幂等性和事务性(Consumer Idempotence and Transactions):消费者可以实现幂等性来处理重复消息。消费者可以使用消息的唯一标识符对消息进行去重,以确保消费的幂等性。此外,Kafka还提供了事务性API,使消费者能够以原子方式读取消息和写入外部系统。
容错性
-
分布式复制:Kafka使用分布式复制来保证数据的可靠性和容错性。每个主题的分区可以有多个副本,这些副本分布在不同的服务器上。当一个Broker发生故障时,副本中的一个会被选举为新的Leader,继续处理读写请求,从而实现了容错。
-
ISR(In-Sync Replicas):Kafka使用ISR机制来保证数据的可靠性和一致性。ISR是指与Leader副本保持同步的副本集合,只有ISR中的副本才被认为是“可靠”的。当Leader副本接收到消息并复制给ISR中的副本后,就会返回确认给生产者。这样,只要ISR中的副本都复制成功,就可保证消息的可靠性。
-
高可用性:Kafka的整体设计目标之一就是保持高可用性。每个分区都有多个副本,可以在集群中的多个Broker上进行分布。当一个Broker发生故障时,副本中的其他Broker可以接管该分区并成为新的Leader,继续提供读写服务,从而实现高可用性。
数据一致性
-
Leader副本顺序保证:Kafka保证了在一个分区中,消息的顺序性。写入请求会被发送到Leader副本,并根据分区中的顺序写入。由于Leader副本负责消息的写入和复制,确保了消息的有序性。
-
分区复制同步:当Leader副本从生产者那里接收到消息后,在将消息写入本地日志前,会等待ISR中的所有副本也完成了相同的写入操作。这样就保证了消息在副本间的复制同步,确保数据的一致性。
-
分区切换机制:当一个副本成为新的Leader时,Kafka会确保新的Leader副本具有与之前的Leader相同的日志内容。这通过Leader副本与ISR中的其他副本进行同步来实现,以保证消息的一致性。
需要注意的是,Kafka提供了至少一次的消息传递语义,这意味着一旦消息被写入并得到确认,就可以确保至少会传递给消费者一次。但由于网络分区、故障恢复等原因,可能会导致消息重复传递的情况。因此,在消费者端需要进行幂等处理来保证数据一致性。
Kafka中ISR
ISR(In-Sync Replicas)是Kafka中用于保证数据可靠性和一致性的概念。ISR是指与Leader副本保持同步的副本集合,是Kafka动态维护的一组同步副本。
在Kafka中,每个主题的分区可以有多个副本(Replica),其中有一个副本被选为Leader,负责处理读写请求,其他副本则作为Follower。当生产者发送消息到Kafka时,消息会首先被写入Leader副本的日志中,并从Leader副本复制到ISR中的其他副本。
只有ISR中的副本完成了对消息的复制,Leader副本才会向生产者返回确认(ack),表示消息已被成功接收和持久化。这样可以保证发送到ISR中的消息在多个副本之间同步,从而达到数据的可靠性和一致性。
当一个Follower副本落后于Leader副本太多(超过了配置的阈值)或发生了故障,它将被视为不再与Leader副本同步,被移出ISR。这样,新的Leader副本将在ISR中的其它副本中选举产生,并重新建立同步。这样做是为了保证数据的可靠性和一致性,不会让落后太多的副本影响读取和写入的性能。同时,当Follower副本恢复正常或者迎上了Leader副本的进度,它将再次加入ISR,并与Leader副本保持同步。
![alt](https://img-blog.csdnimg.cn/img_convert/4e04164ee444a783b3f3383208360aaf.png)
看到这里是不是感觉和Zookeeper的机制非常相似?
通过ISR机制,Kafka确保了在正常运行的情况下,每个分区的消息都被可靠地复制和复制到达。ISR中的副本数量越多,数据的复制同步需要的时间越长,但副本的可用性和数据一致性也更高。同时,通过动态调整ISR的大小,Kafka能够在面对故障或负载变化时做出适应性的响应,从而保证了高可靠性和一致性。
选举Leader
Kafka采用的是法定人数选举(quorum):主要用来通过数据冗余来保证数据一致性的投票算法。在Kafka中该算法的实现就是ISR,在ISR中就是可以被选举为Leader的法定人数。
在Leader宕机后,从ISR列表中选取新的Leader,无论哪个副本被选为新的Leader,它那里都有之前的数据,可以保证在切换了Leader后,消费者可以继续看到HW之前已经提交的数据。
HW的截断机制:新的Leader并不能保证已经完全同步了之前Leader的所有数据,只能保证HW之前的数据是同步过的,此时所有的Follower都要将数据截断到HW的位置,再和新的Leader同步数据,来保证数据一致。 当宕机的Leader恢复,发现新的Leader中的数据和自己持有的数据不一致,此时宕机的Leader会将自己的数据截断到宕机之前的HW位置,然后同步新Leader的数据。宕机的Leader活过来也像Follower一样同步数据,来保证数据的一致性。
结论:
Kafka通过分布式复制、ISR机制、高可用性设计以及分区复制同步等机制,确保了高容错性和数据一致性。这些特性使得Kafka成为处理高吞吐量和大规模数据的可靠分布式消息系统。
顶尖架构师栈
关注回复关键字
【C01】超10G后端学习面试资源
【IDEA】最新IDEA激活工具和码及教程
【JetBrains软件名】 最新软件激活工具和码及教程
工具&码&教程
本文由 mdnice 多平台发布
相关文章:
![](https://img-blog.csdnimg.cn/img_convert/4e04164ee444a783b3f3383208360aaf.png)
Kafka的消息传递保证和一致性
前言 通过前面的文章,相信大家对Kafka有了一定的了解了,那接下来问题就来了,Kafka既然作为一个分布式的消息队列系统,那它会不会出现消息丢失或者重复消费的情况呢?今天咱们就来一探。 实现机制 Kafka采用了一系列机…...
![](https://www.ngui.cc/images/no-images.jpg)
Docker 部署 Firefly III 服务
拉取最新版本的 Firefly III 镜像: $ sudo docker pull fireflyiii/core:latest在本地预先创建好 upload 和 export 目录, 用于映射 Firefly III 容器内的 /var/www/html/storage/upload 和 /var/www/html/storage/export 目录。 使用以下命令来运行 Firefly III …...
![](https://img-blog.csdnimg.cn/740d27de29404100b9095c52896506c0.png)
配置OSPFv3基本功能 华为笔记
1.1 实验介绍 1.1.1 关于本实验 OSPF协议是为IP协议提供路由功能的路由协议。OSPFv2(OSPF版本2)是支持IPv4的路由协议,为了让OSPF协议支持IPv6,技术人员开发了OSPFv3(OSPF版本3)。 无论是OSPFv2还是OSPFv…...
![](https://img-blog.csdnimg.cn/5653122b95154d9ea25871bfaaf9a519.png)
【AI视野·今日Sound 声学论文速览 第九期】Thu, 21 Sep 2023
AI视野今日CS.Sound 声学论文速览 Thu, 21 Sep 2023 Totally 1 papers 👉上期速览✈更多精彩请移步主页 Interesting: 📚Auto-ACD,大规模文本-音频数据集自动生成方法。 基于现有的大模型和api构建了一套大规模高质量的音频文本数据收集方法,…...
![](https://img-blog.csdnimg.cn/ae80bbde19d14b1aa8cb198d3e7637d8.png)
数据结构-----堆(完全二叉树)
目录 前言 一.堆 1.堆的概念 2.堆的存储方式 二.堆的操作方法 1.堆的结构体表示 2.数字交换接口函数 3.向上调整(难点) 4.向下调整(难点) 5.创建堆 6.堆的插入 7.判断空 8.堆的删除 9.获取堆的根(顶)元素 10.堆的遍历…...
![](https://img-blog.csdnimg.cn/ece309112f3a4853a9a7834d527bfcc6.png)
set/multiset容器、map容器
目录 set/multiset容器 set基本概念 set大小和交换 set插入和删除 查找和统计 set和multiset的区别 改变set排序规则 set存放内置数据类型 set存放自定义数据类型 pair队组 map容器 map容器的基本概念 map构造和赋值 map大小和交换 map插入和删除 map查找和统计…...
![](https://www.ngui.cc/images/no-images.jpg)
Linux系统编程——总结初识Linux(常用命令、特点、常见操作系统)
文章目录 UNIX操作系统(了解)Linux操作系统主要特征Linux和unix的区别和联系什么是操作系统常见的操作系统Ubuntu操作系统Ubuntu安装linux下的目录的类型(掌握)shell指令shell指令的格式文件操作相关指令系统相关命令网络相关命令其他命令软件安装相关的…...
![](https://www.ngui.cc/images/no-images.jpg)
Js使用ffmpeg进行视频剪辑和画面截取
ffmpeg 使用场景是需要在web端进行视频的裁剪,包括使用 在线视频url 或 本地视频文件 的裁剪,以及对视频内容的截取等功能。 前端进行视频操作可能会导致性能下降,最好通过后端使用java,c进行处理,本文的案例是备选方…...
![](https://www.ngui.cc/images/no-images.jpg)
Linux基本命令,基础知识
进到当前用户目录:cd ~ 回到上级目录:cd .. 查看当前目录层级:pwd 创建目录:mkdir mkdir ruanjian4/linux/zqm41 -p级联创建文件夹(同时创建多个文件夹需要加-p) 查看详细信息:ls -l (即 ll) 查看所有详细信息:ls -al 隐藏文件是以.开头的 查看:l…...
![](https://img-blog.csdnimg.cn/c4419d29224a4a5d89d5d67e2cc7adee.png)
【Android知识笔记】进程通信(三)
在上一篇探索Binder通信原理时,提到了内存映射的概念,其核心是通过mmap函数,将一块 Linux 内核缓存区映射到一块物理内存(匿名文件),这块物理内存其实是作为Binder开辟的数据接收缓存区。这里有两个概念,需要理解清楚,那就是操作系统中的虚拟内存和物理内存,理解了这两…...
![](https://img-blog.csdnimg.cn/f9ac09c83c204c879e780adfb5fe8e42.jpeg)
云上亚运:所使用的高新技术,你知道吗?
作者简介:一名云计算网络运维人员、每天分享网络与运维的技术与干货。 公众号:网络豆云计算学堂 座右铭:低头赶路,敬事如仪 个人主页: 网络豆的主页 目录 前言 一.什么是云上亚运会 二.为什么要使用云…...
![](https://www.ngui.cc/images/no-images.jpg)
数据结构简述,时间、空间复杂度,学习网站推荐
目录 IT 学习路线 相关坚韧大厚书 相关有趣/耐看书或视频 数据结构与算法学习网站推荐 刷题 时间、空间复杂度 数据结构简述 基本概念 数据结构与算法简述和CS综述整理。本文非基础的教程,本文会列出大量学习和参考网站。老惯例,一个文章是一个集…...
![](https://img-blog.csdnimg.cn/64d16f8ab2d0479487db576704bcf802.png)
在线安装qt5.15之后任意版本
下载qt现在安装包: window安装包链接 进入cmd,用命令行打开安装包,并指定组件下载地址(这个是关键,之前用的是腾讯镜像,出现了版本灰色无法选中问题) .\qt-unified-windows-x64-4.6.1-online…...
![](https://img-blog.csdnimg.cn/97da92f9982b488480f143ec5ec36e28.png)
【kafka实战】01 3分钟在Linux上安装kafka
本节采用docker安装Kafka。采用的是bitnami的镜像。Bitnami是一个提供各种流行应用的Docker镜像和软件包的公司。采用docker的方式3分钟就可以把我们想安装的程序运行起来,不得不说真的很方便啊,好了,开搞。使用前提:Linux虚拟机&…...
![](https://www.ngui.cc/images/no-images.jpg)
yum安装mysql8
记录一下安装过程用于后面项目参考 目录 说明安装步骤yum安装默认目录修改默认的数据目录必要的my.cnf属性修改卸载Mysql 说明 一般情况下都是docker安装,部分特殊情况下,例如老外的项目部分禁用docker,那一般二进制安装或者yum直接安装。 …...
![](https://www.ngui.cc/images/no-images.jpg)
十五)Stable Diffusion使用教程:另一个线稿出3D例子
案例:黄金首饰出图 1)线稿,可以进行色阶加深,不易丢失细节; 2)文生图,精确材质、光泽、工艺(抛光、拉丝等)、形状(包括深度等,比如镂空)和渲染方式(3D、素描、线稿等)提示词,负面提示词; 3)seed调-1,让ai随机出图; 4)开启controlnet,上传线稿图,选择cann…...
![](https://www.ngui.cc/images/no-images.jpg)
2023icpc网络预选赛I. Pa?sWorD(dp)
题目给定字符串长度n以及字符串s 其中出现小写字母可以代表小写字母和大写字母 比如a可以代表a和A 出现?可以代表26个小写字母和26个大写字母和10个数字 出现大写字母和数字就是原本的数 同时要求大写字母,小写字母,数字一定都存在替换完的字符串中…...
![](https://img-blog.csdnimg.cn/17483394b4564f0281567dffe3cc065f.png#pic_center)
maven本地安装jar包
在实际开发中,有些jar包不能通过公共库下载,只能本地安装。可以按照以下步骤操作: 1、安装命令 mvn install:install-file -DgroupIdcom.chinacreator.sm -DartifactIdfbm-sm-common -Dversion0.0.1 -Dpackagingjar -Dfile../newJar/fbm-sm…...
![](https://www.ngui.cc/images/no-images.jpg)
QT中的inherits
目录 简介: 实例: 简介: 在Qt中,可以使用inherits函数来判断一个对象是否属于某个类或其派生类。inherits函数是QObject类的成员函数,因此只能用于继承自QObject的类的对象。 以下是inherits函数的一般用法…...
![](https://img-blog.csdnimg.cn/70a775d4b47446f3af099f4c2d344f1a.png)
全国职业技能大赛云计算--高职组赛题卷①(容器云)
全国职业技能大赛云计算--高职组赛题卷①(容器云) 第二场次题目:容器云平台部署与运维任务1 Docker CE及私有仓库安装任务(5分)任务2 基于容器的web应用系统部署任务(15分)任务3 基于容器的持续…...
![](https://img-blog.csdnimg.cn/06e5055b4aa247b4a50cf640eddb734a.png)
基于springboot+vue的入校申报审批系统
博主主页:猫头鹰源码 博主简介:Java领域优质创作者、CSDN博客专家、公司架构师、全网粉丝5万、专注Java技术领域和毕业设计项目实战 主要内容:毕业设计(Javaweb项目|小程序等)、简历模板、学习资料、面试题库、技术咨询 文末联系获取 项目介绍…...
![](https://img-blog.csdnimg.cn/0753a5bcc2924a0fb0398e6337c5a387.jpeg)
安卓逆向 - EdXposed LSPosed VirtualXposed
一、引言 接上篇:安卓逆向 - Xposed入门教程_小馒头yy的博客-CSDN博客 我们介绍了Xposed入门安装使用,但是只支持到Android 8,并且安装模块需要重启。今天我们来看看Xposed的其他版本。 二、各种Xposed框架对比 1、Xposed 只支持到安卓8&…...
![](https://img-blog.csdnimg.cn/c35fcf25899f4d1bba3ed5388bb07722.png)
Linux三大搜索指令的区别
find:可以在指定的路径下进行文件的搜索 —— 真的在磁盘文件中查找 例如find /usr/bin/ -name ls which 可以在指令路径下,/usr/bin,搜索指令文件 例如:which ls whereis:在系统特定的路径下查找,既可以找到可执行程序ÿ…...
![](https://img-blog.csdnimg.cn/fa1dd3eb2b3840c690facfaa2e1ef6d6.png)
C++ -- 特殊类设计
目录 设计一个类,不能被拷贝 C98的做法 C11的做法 设计一个类,只能在堆上创建对象 实现方式1 实现方式2 设计一个类,只能在栈上创建对象 实现方式1 方式1的优化 实现方式2 设计一个类,不能被继承 设计模式 什么是设计…...
![](https://img-blog.csdnimg.cn/5cf9efcf177d41de9f5b72a141c0fc3d.jpeg)
指针和数组笔试题的透析
指针---进阶篇(三) 一、前言二、一维数组例题透析:三、指针笔试题1.例一:2.例二:3.例三:4.例四:5.例五:6.例六: 一、前言 那么好了好了,宝子们,从…...
![](https://img-blog.csdnimg.cn/c43225a23880429286d0da2e846e8274.gif#pic_center)
「UG/NX」Block UI 超级点SuperPoint
✨博客主页何曾参静谧的博客📌文章专栏「UG/NX」BlockUI集合📚全部专栏「UG/NX」NX二次开发「UG/NX」BlockUI集合「VS」Visual Studio「QT」QT5程序设计「C/C+&#...
![](https://www.ngui.cc/images/no-images.jpg)
Linux——kafka常用命令
一、Kafka的常用命令包括: 1. 启动Zookeeper服务 前台启动: ./bin/zookeeper-server-start.sh config/zookeeper.properties 后台启动: ./bin/zookeeper-server-start.sh -daemon config/zookeeper.properties 2. 停止Zookeeper服务 .…...
![](https://img-blog.csdnimg.cn/img_convert/7662998e1b2db3053ce703c00ec8fa0d.gif)
GLTF编辑器如何快速重置模型原点
1、什么是模型原点? 模型原点是三维建模中的概念,它是指在一个虚拟三维空间中确定的参考点。模型原点通常位于模型的几何中心或基本组件的中心位置。如图所示: 可以看到模型的原点在模型的几何中心 2、模型原点的作用 知道了什么是模型原点&…...
![](https://img-blog.csdnimg.cn/db2aaf039c194ff69b47779c0cdd49ad.png)
【STL】vector常见用法及模拟实现(附源码)
目录 前言1. vector介绍及使用1.1vector的介绍1.2 vector的使用1.2.1 构造函数 1.2.2 vector对象遍历1.2.3 reserve和resize1.2.4 insert和erase 2. vector模拟实现2.1 vector迭代器失效问题2.2 模拟实现reserve函数浅拷贝问题2.3模拟实现源码2.3.1 vector.h2.3.2 test.cpp 前言…...
![](https://www.ngui.cc/images/no-images.jpg)
深度学习保姆级教学
文章目录 前言1.深度学习概论2.神经网络1.基础原理2.损失函数3.SoftMax4.前向传播5.反向传播1.反向传播介绍 6 卷积神经网络应用1.检测任务2.超分辨率重构3.医学检测4.无人驾驶5. 人脸识别 6.卷积网络和传统区别7.卷积神经网络1.卷积做了什么?2.节点网络1.Alexnet2.…...
![](https://common.cnblogs.com/images/copycode.gif)
网站建设需要什么教材/千锋教育官方网
预加载图片是提高用户体验的一个很好方法。图片预先加载到浏览器中,访问者便可顺利地在你的网站上冲浪,并享受到极快的加载速度。这对图片画廊及图片占据很大比例的网站来说十分有利,它保证了图片快速、无缝地发布,也可帮助用户在…...
![](/images/no-images.jpg)
佛山网上业务系统/网络优化工程师需要学什么
1、An Intuitive Explanation of Fourier Theory 这是一个介绍傅里叶变换的英文网站,比较详细。 2、对以上英文网站的粗略翻译 3、这个博客也是不错的 http://blog.sina.com.cn/s/blog_8df0c75501015vuw.html 4、推荐阅读:The Scientist and Engin…...
![](/images/no-images.jpg)
网站开发所使用的浏览器/企业网站模板源码
密钥登录步骤(免密码登录) ssh登录提供两种认证方式:口令(密码)认证方式和密钥认证方式。其中口令(密码)认证方式是我们最常用的一种,出于安全方面的考虑,介绍密钥认证方式登录到linux/unix的方法。 使用密钥登录分为3…...
![](/images/no-images.jpg)
wordpress js调用/西安网站seo技术厂家
UITextField详解 一、基本属性 1、创建文本输入框 UITextField*textField[[UITextField alloc]initWithFrame:CGRectMake(10, 10, 200, 20)]; 2、设置边框样式 textField.borderStyle UITextBorderStyleRoundedRect;//圆角 可选属性: UITextBorderStyleNone,无边框…...
![](/images/no-images.jpg)
php网站优化/百度问一问官网
不能设置文件夹共享的原因看你系统的这两项服务是否是禁止掉,如果禁止掉的,把它启动后就可以设置文件夹共享了!这两项服务是Server,Computer Browser这两个服务,但要Server服务保证启动成功,才可以让Computer Browser服…...
![](/images/no-images.jpg)
水利建设经济定额站网站/电子商务主要干什么
在多线程或单线程任务中,让线程带传入参数一直是个麻烦的问题,通常有种方法就是以类,对像的变量来传参数,这种方法理解上很简单不过在某些场合使用很麻烦,这里就不介绍了,我们主要介绍一种.NET2.0中新增加的带参数运行线程的方法,示例程序如下: ParameterizedThreadStart ParSt…...