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.mzph.cn/news/86453.shtml

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

相关文章

pycharm 中package, directory, sources root, resources root的区别

【遇到的问题】 导入yolov5中有utils文件,自己的代码中也有utils文件,使得yolov5中的这部分引用出错了。 【解决方案】 单独建立detection文件夹,把检测相关的都放在这里,yolov5是github上拉取的源码,发现yolov5中fr…

sum = sum * 10 + ch - ‘0‘;的含义

scanf中以%c格式获取的是单个字符[1],实际存储的是该字符对应的编码。 字符1实际存储的值是该字符的ascii码[2],即49。 如果想得到整数1,就需要用1减去48,48就是0。 1 - 0 49 - 48 1

解决模型半透明时看到内部结构的问题

大家好,我是阿赵。   之前在做钢铁侠线框效果的时候,说到过一种技术,这里单独拿出来再说明一下。   我们经常要做一些模型半透明效果,比如这个钢铁侠的模型,我做了一个Rim边缘光的效果,边缘的地方亮一点…

自定义类型详解(上)

结构体 1 结构体的声明 1.1 结构的基础知识 结构是一些值的集合,这些值称为成员变量。结构的每个成员可以是不同类型的变量。 1.2 结构的声明 struct tag//struct是结构体的标志,tag是标签;名字。 {member-list;//成员变量 }variable-list;//变量列…

linux常见下载安装工具

linux常见下载安装工具 wget、rpm、yum、apt 和 curl 是在Linux系统中常用的命令和工具,用于不同的系统管理和网络操作任务。以下是它们之间的联系与区别: wget: 用途:wget用于从网络上下载文件。它是一个命令行工具&#xff0c…

【AI语言模型】阿里推出音视频转文字引擎

一、前言 阿里的音视频转文字引擎可以正式使用,用户可体验所有AI功能,含全文概要、章节速览、发言总结等高阶AI功能。通过阿里云主账号登录,可享受以下权益: 每日登录,自动获得2小时转写时长; 每邀请1名好…

企业架构LNMP学习笔记53

PHP扩展安装: server01和server03上安装redis扩展: 解压编译安装: shell > tar xvf redis-4.3.0.tgz shell > cd redis-4.3.0 shell > phpize shell > ./configure && make && make install 配置文件php.ini&…

华为云云耀云服务器L实例评测|轻量级应用服务器对决:基于 fio 深度测评华为云云耀云服务器L实例的磁盘性能

本文收录在专栏:#云计算入门与实践 - 华为云 专栏中,本系列博文还在更新中 相关华为云云耀云服务器L实例评测文章列表如下: 华为云云耀云服务器L实例评测 | 从零开始:云耀云服务器L实例的全面使用解析指南华为云云耀云服务器L实…

Flask数据库之SQLAlchemy--介绍--链接数据库

目录 SQLAlchemy介绍 SQLAlchemy连接数据库 SQLAlchemy介绍 数据库是一个网站的基础!!! 比如MySQL、MongoDB、SQLite、PostgreSQL等,这里我们以MySQL为例进行讲解。 SQLAlchemy是一个ORM框架 对象关系映射(英语&…

GoAccess实时分析Nginx日志

GoAccess 是一个基于终端的实时 Web 日志分析仪。用 C 语言编写,它是快速,互动的,并以优雅而直观的方式显示日志。它提供了各种 Web 日志文件的支持,包括 Apache,Nginx,Caddy,Amazon S3 和 Clou…

postman-pre-request-scripts使用

一、场景 二、定义模拟接口 using Microsoft.AspNetCore.Authorization; using Microsoft.AspNetCore.Http; using Microsoft.AspNetCore.Mvc; using SaaS.Framework.DataTransfer; using System.Threading.Tasks;namespace SaaS.KDemo.Api.Controllers {[Route("api/[co…

单元测试(JUint)

单元测试概述 单元测试就是方法测试。 Junit单元测试框架 JUnit是使用Java语言实现的单元测试框架,它是开源的,Java开发者都应当学习并使用JUnit编写单元测试。 此外,几乎所有的IDE工具都集成了JUnit,这样我们就可以直接在IDE中…

docker基础命令快速入门

docker快速入门 Docker是一个虚拟环境容器,可以将你的开发环境、代码、配置文件等一并打包到这个容器中,并发布和应用到任意平台中。 Docker的三个概念 镜像 Docker镜像是一个特殊的文件系统,除了提供容器运行时所需的程序、库、资源、配…

Ubuntu上线一个JAVA环境微服务架构的系统

项目介绍 项目背景: 已经有一套系统,迁移部署到新服务器,并使用不同数据,相同框架,提供对应业务服务 单机测试,从裸机-系统安装-软件架构-部署-数据迁移-发版-上线,整体流程与思路分享,包含后端、数据,测试、网络、运维等相关事务。 项目目的: 部署并迁移系统,…

【QT】Qt的随身笔记(持续更新...)

目录 Qt 获取当前电脑桌面的路径Qt 获取当前程序运行路径Qt 创建新的文本文件txt,并写入内容如何向QPlainTextEdit 写入内容QTimerQMessageBox的使用QLatin1StringQLayoutC在c头文件中写#include类的头文件与直接写class加类名有何区别mutable关键字前向声明 QFontQ…

【数据结构】优先级队列(堆)

文章目录 💐1. 优先级队列1.1 概念 💐2.堆的概念及存储方式2.1 什么是堆2.2 为什么要用完全二叉树描述堆呢?2.3 为什么说堆是在完全二叉树的基础上进行的调整?2.4 使用数组还原完全二叉树 💐3. 堆的常用操作-模拟实现3…

C++ 创建文件并写入内容

文章目录 1.问题2.filesystem3.示例参考文献 1.问题 C 如何向指定路径的文件写入内容呢? 这里有几点要求: 如果目录不存在需要自动创建。如果文件不存在需要自动创建。以覆盖的方式写入内容。 2.filesystem C17 带来了一个新的库:filesy…

OpenCV实现的F矩阵+RANSAC原理与实践

1 RANSAC 筛选 1.1 大致原理 Random sample consensus (RANSAC),即随机抽样一致性,其是一种用于估计模型参数的迭代方法,特别适用于处理包含离群点(outliers)的数据集 RANSAC 的主要思想是随机采样数据点&#xff0…

Java数据结构技巧

Java数据结构技巧 1、循环 for-each循环如果不是"[]"的数组类型&#xff0c;则需要提前判断数据结构是否为空&#xff0c;否则有可能会有空指针异常。 2、对于List对象的i到j位进行排序 for(List<String> now_result:result){List<String> sublist …

详解window.print(),实现长列表打印分页

相信大家平时做项目时&#xff0c;打印需求很常见&#xff0c;但想把打印做好&#xff0c;还是要花点时间的。特别是长列表要分页的情况。 我们知道浏览原生 API window.print() 可以用于印当前窗口&#xff08;window.document&#xff09;视图内容。调用此方法会产生一个打印…