Kafka 4.0 发布:KRaft 替代 Zookeeper、新一代重平衡协议、点对点消息模型、移除旧协议 API
KRaft 全面替代 ZooKeeper
Apache Kafka 4.0 是一个重要的里程碑,标志着第一个完全无需 Apache ZooKeeper® 运行的主要版本。
通过默认运行在 KRaft 模式下,Kafka 简化了部署和管理,消除了维护单独 ZooKeeper 集群的复杂性。
这一变化显著降低了运营开销,增强了可扩展性,并简化了管理任务。
旧架构痛点回顾
在 Kafka 3.x 及更早版本中,ZooKeeper(ZK)是元数据管理的核心组件,负责 Broker 注册、Topic 分区分配、控制器选举等关键任务,如图所示。
然而,这种设计存在显著问题:
-
运维复杂度高:需独立维护 ZK 集群,占用额外资源且增加故障点。
-
性能瓶颈明显:元数据操作依赖 ZK 的原子广播协议(ZAB),大规模集群(如万级分区)下元数据同步延迟可达秒级。
-
扩展性受限:ZK 的写性能随节点数增加而下降,限制 Kafka 集群规模。
KRaft 模式的技术实现
Apache Kafka Raft(KRaft)是在 KIP-500 中引入的共识协议,用于移除 Apache Kafka 对 ZooKeeper 进行元数据管理的依赖。这通过将元数据管理的责任集中在 Kafka 本身,而不是在两个不同的系统(ZooKeeper 和 Kafka)之间分割,从而大大简化了 Kafka 的架构。
KRaft 模式利用 Kafka 中的新法定多数控制器服务,取代了之前的控制器,并使用基于事件的 Raft 共识协议的变体。
Kafka 4.0 默认启用KRaft 模式(Kafka Raft),完全摒弃 ZK 依赖。其核心原理如下:
-
元数据自管理:基于 Raft 共识算法,将元数据存储于内置的
__cluster_metadata
主题中,由 Controller 节点(通过选举产生)统一管理。 -
日志复制机制:所有 Broker 作为 Raft 协议的 Follower,实时复制 Controller 的元数据日志,确保强一致性。
-
快照与恢复:定期生成元数据快照,避免日志无限增长,故障恢复时间从 ZK 时代的分钟级优化至秒级。
我们可以看出 KRaft 替换 ZK,并不是元数据存储重新造轮子,而核心是集群协调机制的演进。
整个通信协调机制本质上是事件驱动模型,也就是 Metadata as an Event Log,Leader 通过 KRaft 生产权威的事件,Follower 和 Broker 通过监听 KRaft 来获得这些事件,并且顺序处理事件,达到集群状态和期望的最终一致。
新一代消费者重平衡协议
传统消费者组采用Eager Rebalance 协议,存在两大瓶颈:
-
全局同步屏障(Stop-the-World):任何成员变更(如扩容、故障)都会触发全组暂停,导致分钟级延迟。
-
扩展性差:消费者数量受限于分区数,万级消费者组重平衡耗时高达数分钟。
Kafka 4.0 引入增量式重平衡协议(KIP-848),核心改进包括:
-
协调逻辑转移:由 Broker 端的
GroupCoordinator
统一调度,消费者仅需上报状态,无需全局同步。 -
增量分配:仅调整受影响的分区,未变更的分区可继续消费。
-
容错优化:局部故障仅触发局部重平衡,避免全组停机。
性能对比与实测数据
指标 | 旧协议(Eager) | 新协议(Incremental) |
---|---|---|
重平衡延迟(万级组) | 60 秒 | <1 秒 |
资源消耗(CPU) | 高 | 降低 70% |
扩展上限 | 千级消费者 | 十万级消费者 |
Kafka 4.0 引入了一种强大的新消费者组协议,旨在显著提高重新平衡性能。
这种优化显著减少了停机时间和延迟,增强了消费者组的可靠性和响应性,尤其是在大规模部署中。
点对点消息模型与共享组
传统上,Kafka 主要采用发布-订阅模式,消费者组模式下,分区需与消费者一一绑定,如下图所示。
无法实现多消费者协同处理同一分区消息,消费者数量不能超过分区数量——最多为一对一。
如下图所示,Consumer 5 无法处理 Topic 消息。
而在某些特定场景下,如点对点的消息传递、任务分配等,传统的队列语义更具优势。
Kafka 4.0 通过引入“队列”功能,共享组(Share Group),允许多消费者同时处理同一分区消息,实现点对点消费模式。
特性 | 传统消费者组 | 共享组 |
---|---|---|
并行消费 | 分区数=消费者数 | 消费者数>分区数 |
消息确认 | 偏移量提交 | 逐条 ACK/NACK |
投递语义 | At-Least-Once | Exactly-Once(可选) |
主要特点:
-
支持传统队列场景:适用于需要保证消息严格顺序且仅由一个消费者处理的场景。
-
提升资源利用率:共享组机制使得多个消费者能够动态地共享分区资源,提高了系统资源的利用率和整体吞吐量。
-
简化架构设计:开发者无需在 Kafka 与其他专门的队列系统之间进行复杂的集成和数据迁移。
共享组(Share Group)机制
Kafka 4.0 通过共享组实现队列语义,关键技术包括:
-
多消费者协同消费:同一分区的消息可由多个消费者并行处理,突破分区数限制。
-
记录级锁机制:每条消息被消费时加锁(TTL 控制),防止重复处理。
-
ACK/NACK 语义:支持逐条确认(Exactly-Once)或重试(At-Least-Once)。
移除旧协议 API 版本,提升系统性能
Kafka 一直以来都致力于兼容各个版本的协议 API,但随着时间的推移,维护大量旧版本的协议 API 带来了许多不必要的复杂性和成本。
在 Kafka 4.0 中,旧版本的协议 API 被彻底移除,系统基准协议直接提升至 Kafka 2.1 版本。
改进点:
-
简化代码:去除了历史包袱,简化了代码结构,统一
KafkaProducer
与KafkaConsumer
接口,减少冗余配置项,减少了测试难度。 -
提高性能:去除了对旧协议 API 的支持,使得系统性能得到了显著提升。废弃 Kafka 2.1 之前的所有 API(如
MessageFormatter
v0)
值得注意的是,在 Kafka 4.0 中,Kafka 客户端和 Kafka Streams 需要 Java 11,而 Kafka Brokers,Connect 和工具现在需要 Java 17。
其他改进
Kafka 4.0 的其他新变化:
-
动态配置优化:
-
自动线程调整:
num.io.threads
根据 CPU 核数动态分配,提升资源利用率。 -
时间窗口偏移量:支持从特定时间点(如 24 小时前)开始消费,替代固定偏移量。
-
-
安全性增强:OAuth 2.0 集成,支持基于 Token 的鉴权,替代 SASL/PLAIN;审计日志:记录所有元数据操作,满足金融级合规要求。
总结
Kafka 4.0 通过彻底摆脱 ZooKeeper,全面采用 KRaft 模式,不仅简化了部署和维护工作,还显著提升了系统的性能和稳定性。
同时,新一代消费者重平衡协议和队列功能的引入,为开发者提供了更为灵活和高效的消息处理模式。
这些架构革新使得 Kafka 4.0 成为了一个更加独立、高效和易用的分布式消息系统,为未来的发展奠定了坚实的基础。
相关文章:
Kafka 4.0 发布:KRaft 替代 Zookeeper、新一代重平衡协议、点对点消息模型、移除旧协议 API
KRaft 全面替代 ZooKeeper Apache Kafka 4.0 是一个重要的里程碑,标志着第一个完全无需 Apache ZooKeeper 运行的主要版本。 通过默认运行在 KRaft 模式下,Kafka 简化了部署和管理,消除了维护单独 ZooKeeper 集群的复杂性。 这一变化显著降…...
MQTT之重复消息(6、在项目中遇到的问题)
项目背景: 在 Spring Boot MQTT 5.0 环境中,RTU设备向SpringBoot平台发送心跳数据、业务监控数据。同时SpringBoot平台可以向RTU设备下发指令,RTU在执行完指令之后向平台发送响应数据。 问题一、SpingBoot平台发送指令给RTU设备,RTU设备能够…...
8、linux c 信号机制
一、信号概述 1. 信号概念 信号是一种在软件层次上对中断机制的模拟,是一种异步通信方式。信号的产生和处理都由操作系统内核完成,用于在进程之间传递信息或通知某些事件的发生。 2. 信号的产生 信号可以通过以下方式产生: 按键产生&…...
Set,Map,WakeSet,WakeMap
简介 Set、Map、WeakMap 和 WeakSet 是 ES6 引入的高级数据结构,它们的底层实现和特性与传统的对象和数组有显著差异 强弱引用了解: link Set Set对象 是一种用于存储 唯一值 的可迭代集合,可存储任意类型的值(原始值、对象引用等&…...
NSSCTF(MISC)—[HITCTF 2021]PNG
相应的做题地址:https://www.nssctf.cn/problem/819 import zlib from Crypto.Cipher import AES import base64 def decode(data, key, iv): cipher AES.new(key, AES.MODE_CBC, iv) decryptByts base64.b64decode(data) msg cipher.decrypt(decryptByts) msgs…...
只出现一次的数字
这个题目动了点脑筋,由于它们时无序的,所以我们如果去找的话比较费劲,可能要循环嵌套再嵌套,所以我们先利用库中自带的sort函数进行排序,把这些数从小到大以此排列,然后我们进行判断哪个数出现了一次即可。…...
【编程中的框架】
编码中常用的框架及其使用方法和好处 框架(Framework)是一种为解决特定问题而设计的软件架构,它提供了一组预定义的组件、模式和工具,帮助开发者更高效地构建应用程序。框架通常不仅仅是方法库,它们提供了一种结构化的…...
Python-常用关键字
基础值 1. False - 意义:布尔类型假值(首字母大写) - 用法示例: if condition is False: print("条件为假") 2. True - 意义:布尔类型真值(首字母大写) - 用法示例&…...
【计算机网络】DHCP工作原理
DHCP(动态主机配置协议) Dynamic Host Configuration Protocol 基于UDP协议传输 DHCP分配IP地址的过程 (1)DHCP DISCOVER客户机请求 IP 地址: 当一个 DHCP 客户机启动时,客户机还没有 IP 地址,所以客户机要通过 DHC…...
python 原型链污染学习
复现SU的时候遇到一道python原型链污染的题,借此机会学一下参考: 【原型链污染】Python与Jshttps://blog.abdulrah33m.com/prototype-pollution-in-python/pydash原型链污染 文章目录 基础知识对父类的污染命令执行对子类的污染pydash原型链污染打污染的…...
量子计算:未来计算技术的革命性突破
在当今科技飞速发展的时代,量子计算正逐渐从理论走向实践,成为计算技术领域最具潜力的革命性突破之一。与传统计算机基于二进制的计算方式不同,量子计算利用量子比特(qubit)的叠加和纠缠特性,能够在处理复杂…...
Maven:Java项目构建与依赖管理工具
Maven 是什么 Maven 将项目开发过程和管理过程抽象成一个项目对象模型(POM),本质上是一个项目管理工具。Maven 主要用于Java项目的依赖管理、编译、测试、打包和部署等操作。 Maven的核心设计围绕标准化和自动化,通过一系列约定和…...
内积相似系数——内积度量相似系数
内积与相似系数 内积(Inner Product) 内积(Inner Product),也称为点积(Dot Product)或标量积,两个向量点积的结果是一个标量(通常是实数或复数)。 内积&…...
问题:md文档转换word,html,图片,excel,csv
文章目录 问题:md文档转换word,html,图片,excel,csv,ppt**主要职责****技能要求****发展方向****学习建议****薪资水平** 方案一:AI Markdown内容转换工具打开网站md文档转换wordmd文档转换pdfm…...
GET 和 POST 有什么区别
GET 和 POST 是 HTTP 协议中两种最常见的请求方法,它们在用途、安全性、数据传递方式等方面有显著的区别。以下是它们的主要区别: 1. 用途 • GET: • 用于从服务器获取资源(数据)。 • 是一种无状态的操作…...
AI Agent 人工智能相关公开比赛汇总
参与 AI 相关比赛是提升技术能力、接触前沿算法、积累项目经验的绝佳方式。以下是全球知名的比赛,以及适合不同水平选手的竞赛分类。 1. 全球知名 AI & 计算机竞赛 (1) Kaggle 竞赛(Kaggle Competitions) 简介:全球最知名的…...
Java 多线程编程之 Object.wait 方法(工作原理、高级特性、notify 方法与 notifyAll 方法)
一、wait 方法 1、基本介绍 wait 方法是 Java 中每个对象都拥有的方法,它继承自 Object 类 wait 方法使当前线程进入等待状态,直到其他线程调用该对象的 notify 方法或 notifyAll 方法 wait 方法必须在同步代码块中使用,否则抛出 Interrup…...
python下载m3u8格式视频
一、安装 m3u8库 pip install requests pip install requests m3u8 二、编码实现 import os import re import requests import subprocess# 下载ts文件 def down_ts_file(base_url, m3u8_url, download_dir):# 从m3u8文件中获取所有ts的分片名称信息response requests.get…...
3.30 代码随想录第三十天打卡
准备:01背包理论基础(二维) 1.有n个物品每个物品只有一个 2.完全背包是有n个物品每个物品有无限多个 3.多重背包是有n个物品每种物品个数各不相同 (1)题目描述: (2)解题思路; 1…...
01 相机标定与相机模型介绍
学完本文,您将了解不同相机模型分类、内参意义,及对应的应用代码模型 标定的意义 建模三维世界点投影到二维图像平面的过程。标定输出的是相机模型。 相机模型 相机模型可以解理解为投影模型 +...
鸿蒙学习手册(HarmonyOSNext_API16)_应用开发UI设计:相对布局
概述 RelativeContainer 就像个「智能拼图板」,帮你把界面组件像拼图一样自由组合,不用一层套一层地堆叠。每个组件可以直接「贴」到其他组件旁边或容器边缘,省去多层嵌套的麻烦,让复杂界面更高效。 举个接地气的例子 dz…...
关于为什么使用redis锁,不使用zk锁的原因
实际项目中,redis一直是最为稳定、可靠的部分,你根本不用担心redis本身的问题。至于ap模型的问题,绝大多数分布式锁只是用于避免一些极端情况的,若单一数据会有那么高的并发量你还加锁,那就要考虑这个业务场景设置的合…...
string的基本使用
C基础格式 C语言语法STL。蓝桥杯选用C11的版本。 #include <bits/stdc.h> #include <iostream> using namespace std; int main() {cout<<"Hello World!"<<endl;printf("Hello World!");return 0; } 基本数据类型 #include &l…...
论文阅读笔记——PointVLA: Injecting the 3D World into Vision-Language-Action Models
PointVLA 论文 现有的 VLA 基于 2D 视觉-语言数据表现良好但缺乏 3D 几何先验导致空间推理缺陷。传统方案:1)3D->2D 投影,造成几何信息损失;2)3D 数据集少。PointVLA 保留原有 VLA,提取点云特征…...
MySQL数据库精研之旅第四期:解锁库操作高阶技能
专栏:MySQL数据库成长记 个人主页:手握风云 目录 一、查看所有表 1.1. 语法 二、创建表 2.1. 语法 2.2. 示例 2.3. 表在磁盘上对应的⽂件 三、查看表结构 3.1. 语法 3.2. 示例 四、修改表 4.1. 语法 4.2. 示例 五、删除表 5.1. 语法 5.2.…...
自定义一个C语言字符串取整函数
一、字符串取整的主要思路 1、遍历每个字符; 2、获得0到9的字符对应的整数值; 3、把对应位置的十进制权重相乘; 4、把所有的相乘结果相加; 5、返回相加结果; 二、主要代码 // 主要是把十进制的整数字符转成十进制变量值…...
Ruby 命令行选项
Ruby 命令行选项 概述 Ruby 是一种广泛使用的编程语言,它拥有强大的命令行工具,可以帮助开发者进行各种任务。了解 Ruby 的命令行选项对于提高开发效率至关重要。本文将详细介绍 Ruby 的常用命令行选项,帮助开发者更好地利用 Ruby 的命令行功能。 Ruby 命令行选项概述 R…...
3.29:数据结构-绪论线性表-上
一、时间复杂度 1、ADT 2、定义法计算时间复杂度:统计核心语句的总执行次数 (1)例题1,与2022年的真题对比着写 此题关键在于求和公式的转化,类型为:线性循环嵌套非线性循环 2022年那道题如果考场上实在脑…...
【百日精通 JAVA | SQL篇 | 第一篇】初识数据库
一、数据库是什么? 数据库是一类软件,数据库的作用用于管理系统(这是一款成品软件,内部应用了很多数据结构)。 二、数据库分为两大类 1.关系型数据库 对于数据的要求比较严格 通常是以表格的方式来组织数据的。(和Excel差不多) 典型代表…...
yum repolist all全部禁用了 怎么办
文章目录 步骤思考解决yum仓库全部被禁用的问题步骤思考: 检查仓库状态:运行yum repolist all,查看所有仓库的启用状态。 被禁用的仓库会显示为disabled。 启用所有仓库:可以逐一启用,或者使用命令批量启用。 例如使用yum-config-manager --enable ‘*’,但需要注意是否有…...
gnvm切换node版本号
1. gnvm下载官网 GNVM - Node.js version manager on Windows by Go 2. 安装 2.1 不存在 Node.js 环境 下载并解压缩 gnvm.exe 保存到任意文件夹,并将此文件夹加入到环境变量 Path。 2.2 存在 Node.js 环境 下载并解压缩 gnvm.exe 保存到 Node.js 所在的文件夹。 2.…...
maven高级
1.分模块开发与设计 理解并实现分模块开发 能够使用聚合工程快速构建项目 能够使用继承简化项目配置 能够根据需求配置生成、开发、测试环境,并在各个环境间切换运行 了解Maven的私服 1.1分模块开发:将别人写好的功能或是包直接使用, 引入依赖…...
MyBatis-Plus 多数据源配置与读写分离实战
一、引言 在实际的项目开发中,我们常常会遇到需要操作多个数据库的情况,比如纯粹多库、读写分离、一主多从、混合模式等。本文将详细介绍如何使用 MyBatis-Plus 实现纯粹多库的场景,并探讨读写分离的实现思路。 二、环境准备 开发工具&…...
pip install cryptacular卡住,卡在downloading阶段
笔者安装pip install cryptacular卡在downloading阶段,但不知道为何 Collecting cryptacularCreated temporary directory: /tmp/pip-unpack-qfbl8f08http://10.170.22.41:8082 "GET http://repo.huaweicloud.com/repository/pypi/packages/42/69/34d478310d6…...
Baklib解析企业内容管理与内容中台核心差异
企业内容管理技术架构解析 在企业数字化进程中,企业内容管理系统(ECM)以结构化技术框架为核心,通过文档全生命周期管理与元数据控制实现内容资产的高效治理。其架构通常包含分布式存储引擎、多层级权限体系及标准化工作流模块&am…...
力扣每日一题:2716——最小化字符串长度
2716——最小化字符串长度 题目示例示例 1示例 2示例 3 题解理解 题目 给你一个下标从 0 开始的字符串 s ,重复执行下述操作任意次: 在字符串中选出一个下标i ,并使 c 为字符串下标i处的字符。并在 i 左侧(如果有)和…...
掌握正则表达式:从基础到实用示例
目录 一、简单谈谈正则 二、基础知识学习 (一)正则元字符 1.特殊单字符 2.空白符 3.量词 4.范围备和选项 综合练习 (二)贪婪、非贪婪与独占模式 1.贪婪模式 2.非贪婪模式(懒惰模式) 3.独占模式…...
Python 中列表(List)、元组(Tuple)、集合(Set)和字典(Dict)四大数据结构的完整对比
以下是 Python 中列表(List)、元组(Tuple)、集合(Set)和字典(Dict)四大数据结构的完整对比分析,结合了核心特性、操作方式和应用场景的深度总结: 一、核心特性…...
LK光流和特征点的关系
uv方程 光流有两个假设: 1.亮度恒定,即图像相同位置的灰度短时不变。两帧中对应像素灰度/亮度相同 2.时间持续性(微小移动),这意味着时间的变化不会引起像素位置的剧烈变化,这样像素的灰度值才能对位置求…...
Rocky Linux 9.5中完美迁移mysql5.6.17到mysql5.7.11
首先Rocky Linux 9.5中,默认官方建议使用的是mysql8.0,项目要兼容以往数据,经过测试跟mysql5.7.11能做兼容。 一:工具准备以及安装步骤 1、官网下载地址:https://downloads.mysql.com/archives/community/ 下载版本…...
练习题:113
目录 Python题目 题目 题目分析 需求理解 关键知识点 实现思路分析 代码实现 代码解释 定义列表: for 循环遍历列表: 输出元素: 运行思路 结束语 Python题目 题目 使用for循环遍历一个列表并输出每个元素。 题目分析 需求理…...
文件上传存储安全OSS 对象分站解析安全解码还原目录执行
# 文件 - 解析方案 - 执行权限 & 解码还原 1 、执行权限 文件上传后存储目录不给执行权限 2 、解码还原 数据做存储,解析固定(固定协议)(文件后缀名无关) 文件上传后利用编码传输解码还原 # 文件 - 存储方案 - 分站存储…...
NUUO摄像头debugging_center_utils命令执行漏洞
免责声明:本号提供的网络安全信息仅供参考,不构成专业建议。作者不对任何由于使用本文信息而导致的直接或间接损害承担责任。如涉及侵权,请及时与我联系,我将尽快处理并删除相关内容。 漏洞描述 NUUO NVR是中国台湾省NUUO公司旗…...
华为OD机试2025A卷 - 正则表达式替换(Java Python JS C++ C )
最新华为OD机试 真题目录:点击查看目录 华为OD面试真题精选:点击立即查看 题目描述 为了便于业务互交,约定一个对输入的字符串中的下划线做统一替换。 具体要求如下: 输入字符串,将其中包含的每一个下划线“_”,使用特殊字符串(^|$|[,+])替换,并输出替换后的结果…...
2025-3-30算法打卡
一,小明的彩灯 1.题目描述: 题目描述 小明拥有 NN 个彩灯,第 ii 个彩灯的初始亮度为 aiai。 小明将进行 QQ 次操作,每次操作可选择一段区间,并使区间内彩灯的亮度 xx(xx 可能为负数)。 求…...
【今日半导体行业分析】2025年3月30日
今日探针卡行业分析:把握机遇,应对挑战 一、引言 在半导体产业的精密制造流程中,探针卡作为晶圆测试环节的核心设备,犹如一颗精密的 “心脏”,承担着芯片封装前电学性能测试与筛选的重任。其性能的优劣直接关系到芯片…...
深度学习Note.5(机器学习2)
多项式回归 1.与线性回归联系: 与线性回归大体相似,代码部分复用性高,不同点:公式中为x的次方,可能要规范化处理。 2.paddle的API paddle.sin(x, nameNone) 功能:计算输入的正弦值。 输入:输入…...
三、分类模块,通用组件顶部导航栏Navbar
1.封装通用组件顶部导航栏Navbar 不同效果 Component export struct MkNavbar {Prop title: string Prop leftIcon: ResourceStr $r("app.media.ic_public_left")ProprightIcon: ResourceStr $r("app.media.ic_public_more")PropshowLeftIcon: boolean…...
PipeWire 音频设计与实现分析三——日志子系统
日志子系统 PipeWire 的日志子系统的设计分为多个层次。PipeWire 用 struct spa_log 对象描述日志组件,用 struct spa_log_methods 对象描述日志组件打印各层级日志的多个方法。PipeWire 为日志子系统添加了 topic 机制,不同文件中的日志按功能以不同的…...
playwright解决重复登录问题,通过pytest夹具自动读取storage_state用户状态信息
playwright解决重复登录问题,通过pytest夹具自动读取storage_state用户状态信息 conftest.py文件下封装两个夹具夹具一:将storage_state登录状态导出为json文件夹具二:重写夹具browser_context_args,添加storage_state登录状态登录…...