Kafka的消息传递保证和一致性

alt

前言

通过前面的文章,相信大家对Kafka有了一定的了解了,那接下来问题就来了,Kafka既然作为一个分布式的消息队列系统,那它会不会出现消息丢失或者重复消费的情况呢?今天咱们就来一探。

实现机制

Kafka采用了一系列机制来实现消息传递的保证和一致性,关键点:

  1. 至少一次的消息传递(At Least Once Delivery):Kafka确保消息至少会被传递给消费者一次。生产者写入消息到Kafka时,会等待消息被持久化并复制到ISR中的副本,并返回一个确认(ack)给生产者。只有当所有ISR中的副本都完成了消息的复制后,消息才被认为是提交成功的,生产者才会收到确认。这样可以确保消息的可靠性,但也可能出现消息重复传递的情况。

  2. 消费者的消费位置(Consumer Offset):消费者在消费消息时,会记录自己的消费位置,即消费者偏移量(consumer offset)。消费者可以将偏移量提交到Kafka,以便在重启或故障恢复后继续消费。Kafka会将消息的偏移量持久化,保证在故障发生时可以对未消费的消息进行重播。

  3. 消费者组的协调和重平衡(Consumer Group Coordination and Rebalance):Kafka的消费者可以组成一个消费者组,共同消费一个或多个主题的消息。消费者组中的每个消费者负责处理一个或多个分区。当消费者组中的消费者变化时(如新加入消费者、消费者故障等),Kafka会进行消费者组的重平衡,重新分配分区给消费者。重平衡是为了保证每个分区只有一个消费者进行消费,以保证消息的顺序性和一致性。

  4. 消费者的幂等性和事务性(Consumer Idempotence and Transactions):消费者可以实现幂等性来处理重复消息。消费者可以使用消息的唯一标识符对消息进行去重,以确保消费的幂等性。此外,Kafka还提供了事务性API,使消费者能够以原子方式读取消息和写入外部系统。

容错性

  1. 分布式复制:Kafka使用分布式复制来保证数据的可靠性和容错性。每个主题的分区可以有多个副本,这些副本分布在不同的服务器上。当一个Broker发生故障时,副本中的一个会被选举为新的Leader,继续处理读写请求,从而实现了容错。

  2. ISR(In-Sync Replicas):Kafka使用ISR机制来保证数据的可靠性和一致性。ISR是指与Leader副本保持同步的副本集合,只有ISR中的副本才被认为是“可靠”的。当Leader副本接收到消息并复制给ISR中的副本后,就会返回确认给生产者。这样,只要ISR中的副本都复制成功,就可保证消息的可靠性。

  3. 高可用性:Kafka的整体设计目标之一就是保持高可用性。每个分区都有多个副本,可以在集群中的多个Broker上进行分布。当一个Broker发生故障时,副本中的其他Broker可以接管该分区并成为新的Leader,继续提供读写服务,从而实现高可用性。

数据一致性

  1. Leader副本顺序保证:Kafka保证了在一个分区中,消息的顺序性。写入请求会被发送到Leader副本,并根据分区中的顺序写入。由于Leader副本负责消息的写入和复制,确保了消息的有序性。

  2. 分区复制同步:当Leader副本从生产者那里接收到消息后,在将消息写入本地日志前,会等待ISR中的所有副本也完成了相同的写入操作。这样就保证了消息在副本间的复制同步,确保数据的一致性。

  3. 分区切换机制:当一个副本成为新的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

看到这里是不是感觉和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 多平台发布

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.rhkb.cn/news/142432.html

如若内容造成侵权/违法违规/事实不符,请联系长河编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

怎样找到NPM里面开源库下载地址

场景 最近帮忙找一个开源库地址。这里以vue/language-core为例子。 解决 https://registry.npmmirror.com/vue/language-core/1.8.13这里就是如下格式: https://registry.npmmirror.com/{包名}/{版本号}打开这个页面后,得到开源库下载地址&#xff0c…

Java基于SSM+JSP的服装定制系统

博主介绍:✌程序员徐师兄、7年大厂程序员经历。全网粉丝30W、csdn博客专家、掘金/华为云/阿里云/InfoQ等平台优质作者、专注于Java技术领域和毕业项目实战✌ 文章目录 1 简介2 .技术栈3 分析4系统设计4.1 软件功能模块设计4.2.2 物理模型设计 5系统详细设计5.1系统功…

力扣:110. 平衡二叉树(Python3)

题目: 给定一个二叉树,判断它是否是高度平衡的二叉树。 本题中,一棵高度平衡二叉树定义为: 一个二叉树每个节点 的左右两个子树的高度差的绝对值不超过 1 。 来源:力扣(LeetCode) 链接&#xff…

目前很火的养猫微信小程序源码带流量主+搭建教程

目前很火的养猫微信小程序源码带流量主搭建教程。 搭建教程 进入小程序我们下载开发者工具 开发者工具安装好了 我们就把前端源码导入进开发者工具中 这里的APPID我们填写自己的小程序APPID 修改siteinfo.js里的uniacid和acid 这两个ID在刚才后端添加的小程序那里看 在把…

2023年信创云管平台选哪家?咨询电话多少?

随着云计算和信创国产化的快速发展,越来越多企业需要支持信创系统的云管平台。但很多企业不知道市面上信创云管平台有哪些,也不知道选哪家?这里我们小编就给大家来回答一下。 2023年信创云管平台选哪家?咨询电话多少?…

九日集训 Leetcode 371.两整数之和

给你两个整数 a 和 b &#xff0c;不使用 运算符 和 - &#xff0c;计算并返回两整数之和。 示例 1&#xff1a; 输入&#xff1a;a 1, b 2 输出&#xff1a;3示例 2&#xff1a; 输入&#xff1a;a 2, b 3 输出&#xff1a;5提示&#xff1a; -1000 < a, b < 10…

智能生活从这里开始:数字孪生驱动的社区

数字孪生技术&#xff0c;这个近年来备受瞩目的名词&#xff0c;正迅速渗透到社区发展领域&#xff0c;改变着我们居住的方式、管理的方式以及与周围环境互动的方式。它不仅仅是一种概念&#xff0c;更是一种变革&#xff0c;下面我们将探讨数字孪生技术如何推动社区智能化发展…

力扣-169. 多数元素(C语言+分治递归)

1. 题目 给定一个大小为 n 的数组 nums &#xff0c;返回其中的多数元素。多数元素是指在数组中出现次数 大于 ⌊ n/2 ⌋ 的元素。 你可以假设数组是非空的&#xff0c;并且给定的数组总是存在多数元素。 2. 输入输出样例 示例1 输入&#xff1a;nums [3,2,3] 输出&#xff…

代码随想录算法训练营第四十九天 | 动态规划 part 10 | 买卖股票的最佳时机i、ii

目录 121. 买卖股票的最佳时机思路代码 122.买卖股票的最佳时机II思路代码 121. 买卖股票的最佳时机 Leetcode 思路 贪心&#xff1a;记录最低值&#xff0c;并且遍历股票逐个寻找股票卖出最大值 动态规划&#xff1a; dp[i][0] 表示第i天持有股票所得最多现金 dp[i][1] 表示…

黎明加水印微信小程序源码 支持流量主接入

黎明加水印微信小程序源码&#xff0c;支持流量主接入。支持从聊天记录选择文件、相机拍摄、直接选择文件 支持白底、黑底的隐形水印&#xff0c;制作后&#xff0c;通过增加蒙版方能看到水印 纯前端&#xff0c;可嵌入任何项目。 部署教程 1、解压后得到项目文件夹 3、把…

什么才是物联网领域最好的开发语言?

什么才是物联网领域最好的开发语言&#xff1f; 最好&#xff01;运行最快&#xff1f;开发最高效&#xff1f;最容易学习&#xff1f; 各有特点&#xff01; 采用C/C语言&#xff0c;运行最快&#xff0c;一般采用厂家提供的底层驱动支持包BSP&#xff0c;所有MCU都支持。如…

华为OD机考算法题:最小数量线段覆盖

目录 题目部分 解读与分析 代码实现 题目部分 题目最小数量线段覆盖难度难题目说明给定坐标轴&#xff08;一维坐标轴&#xff09;上的一组线段&#xff0c;线段的起点和终点均为整数并且长度不小于1&#xff0c;请你从中找到最少数量的线段&#xff0c;这些线段可以覆盖住…

【从0学习Solidity】36. 默克尔树 Merkle Tree

【从0学习Solidity】36. 默克尔树 Merkle Tree 博主简介&#xff1a;不写代码没饭吃&#xff0c;一名全栈领域的创作者&#xff0c;专注于研究互联网产品的解决方案和技术。熟悉云原生、微服务架构&#xff0c;分享一些项目实战经验以及前沿技术的见解。关注我们的主页&#xf…

通俗易懂-OpenCV角点检测算法(Harris、Shi-Tomas算法实现)

目录 1 图像的特征 2&#xff0c;Harris角点检测 2.1 代码实现 2.2结果展示 3&#xff0c;Shi-Tomasi角点检测算法 3.1 &#xff0c; 代码实现 3.2结果展示 1 图像的特征 2&#xff0c;Harris角点检测 、 2.1 代码实现 import cv2 as cv import matplotlib.pyplot as …

QFrame类学习笔记

1、QFrame的作用 QFrame类继承于QWidget类&#xff0c;被QAbstractScrollArea, QLabel, QLCDNumber, QSplitter, QStackedWidget, and QToolBox等类继承。 QFrame作为许多基础控件的基类&#xff0c;提供许多成员方法给子类&#xff0c;实现子类的框架样式的设计。框架样式主要…

基于微信小程序的健身小助手打卡预约教学系统(源码+lw+部署文档+讲解等)

文章目录 前言系统主要功能&#xff1a;用户的功能设计为&#xff1a;管理员的功能设计为&#xff1a;健身房的功能设计为&#xff1a;具体实现截图论文参考详细视频演示为什么选择我自己的网站自己的小程序&#xff08;小蔡coding&#xff09;有保障的售后福利 代码参考源码获…

【数据结构】插入排序:直接插入排序、折半插入排序、希尔排序的学习知识总结

目录 1、排序的基本概念 2、直接插入排序 2.1 算法思想 2.2 代码实现 3、折半插入排序 3.1 算法思想 3.2 代码实现 4、希尔排序 4.1 算法思想 4..2 代码实现 1、排序的基本概念 排序是将一组数据按照预定的顺序排列的过程&#xff0c;排序的基本概念包括以下内容…

electron快速入门

新建electronstu01文件夹 以管理员身份运行powershell&#xff0c;切换到该文件下 npm init -y安装依赖包 npm install --save-dev electron失败 npm install -g cnpm --registryhttps://registry.npm.taobao.org cnpm install --save-dev electron修改 package.json &qu…

正则表达式的应用(前端写法)

文章目录 1、匹配字符串中&#xff0c;a标签的href值2、校验邮箱3、校验手机号码3、待添加... 1、匹配字符串中&#xff0c;a标签的href值 (1) 代码 /*** description 匹配字符串中&#xff0c;a标签的href值* param {string} str 匹配的字符串* return {Array} 返回href值*/…

冒泡排序与选择排序(最low的两兄弟)

个人主页&#xff1a;Lei宝啊 愿所有美好如期而遇 前言&#xff1a; 在我们的生活中&#xff0c;无处不在用到排序&#xff0c;比如说成绩的排名&#xff0c;淘宝&#xff0c;京东等等商品在各个方面的排序&#xff0c;这样看来一个好的算 法很重要&#xff0c;接下来我们要先…