当前位置: 首页 > news >正文

Kafka入门04——原理分析

目录

01理解Topic和Partition

Topic(主题)

Partition(分区)

02理解消息分发

消息发送到分区

消费者订阅和消费指定分区

总结

03再均衡(rebalance)

再均衡的触发

分区分配策略

RangeAssignor(范围分区)

RoundRobinAssignor(轮询分区)

StickyAssignor(粘性分区)

Rebalance执行者Coordinator

再均衡的过程

再均衡的目的

04消费者读取消息Offset

消费者 Offset 的作用

重平衡和 Offset


01理解Topic和Partition

Topic 是消息的逻辑分类,而 Partition 是物理存储单元。在 Apache Kafka 中,Topic 和 Partition 是两个核心概念,它们用于管理消息的发布、存储和消费。不同的topic消息是分开存储的,同一topic下的不同分区包含的消息是不同的。

以下是对 Topic 和 Partition 的详细解释:

Topic(主题)
  1. Topic 是消息的逻辑容器:Topic 是 Kafka 中的消息分类或主题,它是消息的逻辑容器,类似于消息的类别或主题。生产者将消息发布到特定的 Topic,而消费者则订阅 Topic 来接收消息。

  2. 消息发布到 Topic:生产者将消息发布到一个或多个 Topic,可以根据业务需求创建不同的 Topic,每个 Topic 用于存储特定类型或主题的消息。

Partition(分区)
  1. 分区是消息的物理存储单元:分区是 Topic 的物理存储单元,它实际上是一个独立的消息日志文件。每个分区都包含一定范围的消息,消息以消息偏移量进行标识。

  2. 分区提供水平扩展:Kafka 允许为每个 Topic 配置多个分区,这些分区可以分布在不同的 Kafka 代理节点上,以提供水平扩展和分布负载的能力。

  3. 消息的顺序性:每个分区中的消息保持顺序性,即消息按照它们写入的顺序存储。这有助于维护消息的顺序性,特别对于需要处理有序数据的应用程序很重要。

  4. 多个消费者可以并行读取:多个消费者可以并行读取同一 Topic 的不同分区,以提高读取性能。这允许 Kafka 处理大规模的数据流和事件。

02理解消息分发

消息时Kafka中最基本的数据单元,在Kafka中,一条消息由key、value两部分组成。消息的发送由生产者负责。Kafka 的消息分发机制涉及生产者将消息发送到分区和消费者如何订阅和消费指定分区的消息。

消息发送到分区
  1. 消息键(Message Key):Kafka 生产者可以为每条消息指定一个消息键。消息键是一个字符串,它被用于确定消息应该发送到哪个分区。如果消息键为空,Kafka 生产者会使用分区分配策略来选择目标分区。

  2. 分区分配策略:Kafka 提供多种分区分配策略,例如轮询、随机、按键等策略。这些策略用于决定将消息发送到哪个分区。

  3. 生产者发送消息:生产者将消息与消息键一起发送到 Kafka 主题。如果指定了消息键,分区分配策略将使用消息键来选择目标分区。如果没有指定消息键,分区分配策略将使用轮询或其他默认策略。

消费者订阅和消费指定分区
  1. 消费者组:消费者通常以消费者组(Consumer Group)的形式消费消息。每个消费者组可以有多个消费者,它们一起消费主题中的消息。

  2. 订阅主题:消费者组通过订阅主题来指定要消费的消息来源。消费者组可以订阅一个或多个主题。

  3. 分区分配策略:Kafka 提供了分区分配策略,这些策略用于将分区分配给消费者组中的不同消费者。分区分配策略可以是轮询、最少分区、按键等策略。分区分配策略确保分区在消费者组中均匀分布。

  4. 消费指定分区:消费者可以通过分区分配策略订阅特定的分区,这样它们只会消费来自这些分区的消息。这是一种高度灵活的方式,允许消费者精确控制它们所消费的消息。

关于消费者消费消息:

  • 消费者组里的3个消费者会分别消费3个分区的消息,如果组里只有2个消费者,还是3个分区的情况下,那么有一个消费者会消费两个分区的消息,由策略决定。

  • Kafka的设计上,分区是不允许并发的,所以消费者数量大于分区数量是浪费

  • 当消费者少于分区的时候,需要尽可能保证读取均匀

  • 消费者从多个分区读数据不能保证总体的顺序性,只能保证单个分区数据的顺序性

  • 增减分区(partition)、消费者(consumer)以及节点(broker)都会导致再均衡(rebalance)

总结
  • 生产者发送消息时,可以选择是否指定消息键,以及采用哪种分区分配策略。

  • 消费者通常以消费者组的形式订阅主题,分区分配策略确保消息分布均匀。

  • 消费者可以选择消费特定的分区,从而控制它们所消费的消息。

03再均衡(rebalance)

Kafka 中的再均衡(Rebalance)是指在消费者组中发生变化(如有新消费者加入或旧消费者离开)时,Kafka 会重新分配分区以确保消息的均匀分发。再均衡是 Kafka 消费者组的核心机制,它确保消息的负载均衡和高可用性。

再均衡的触发
  1. 新消费者加入:当一个新消费者加入消费者组时,会触发再均衡。新消费者会参与到消费者组的分区分配中。

  2. 消费者离开:当一个消费者离开消费者组时,也会触发再均衡。分区将被重新分配给其它消费者。

  3. 分区数变化:如果 Kafka 主题的分区数发生变化,也可能触发再均衡,以确保新的分区能够被消费者组消费。

分区分配策略

Kafka 使用分区分配策略来决定分区如何分配给消费者。再均衡会触发分区分配。

常见的三种分区分配策略,Range(默认)、RoundRobin(轮询)和StickyAssignor(粘性)。

  1. RangeAssignor(范围分区)

    将同一主题中的分区按序号排序,对消费者按字母顺序排序。

    假设 :n = 分区数/消费者数量,m = 分区数%消费者数量

    那么前m个消费者每个分配n+1个分区,剩余的消费者每个分配n个分区

    例如:10个分区,3个消费者。(n = 10 /3 = 3,m = 10 % 3 = 1)

    结果:消费者A对应分区0,1,2,3。消费者B对应分区4,5,6。消费者C对应分区7,8,9。

  2. RoundRobinAssignor(轮询分区)

    将所有分区和消费者按照hashcode进行排序,通过轮询的方式分配给消费者。

    例如:10个分区的排序为0,2,3,4,1,8,6,9,5,7。消费者是A、B、C、D。

    结果: A对应分区0,1,5。B对应分区2,8,7。C对应分区3,6。D对应分区4,9。

  3. StickyAssignor(粘性分区)

    也叫粘滞策略,主要两个目的:

    • 分区的分配尽可能均匀

    • 分区的分配尽可能和上次分配保持相同

Rebalance执行者Coordinator

Kafka中指定了Coordinator负责再均衡的分区分配和消费者组的管理。Coordinator的确定:消费者向Kafka集群中的任意一个broker发送一个GroupCoordinatorRequest请求,服务端会返回一个负载均衡最小的broker节点的id,并将该broker设置为coordinator。

再均衡的过程
  1. 当再均衡触发时,Kafka 协调器(Coordinator)会协调分区的重新分配。协调器是 Kafka 服务中的一个组件,负责处理消费者组的管理和再均衡。

  2. 消费者向协调器发送它们当前持有的分区信息,协调器根据分区分配策略计算新的分区分配方案。

  3. 一旦计算出新的分区分配方案,协调器将新分配的分区信息通知给每个消费者。

  4. 消费者根据新的分区分配方案重新分配和管理分区,开始消费分配给它们的消息。

再均衡的目的
  • 均衡消费者间的分区负载,确保每个消费者处理大致相等数量的消息。

  • 支持高可用性:如果某个消费者发生故障,分区可以重新分配给其它活跃的消费者,以确保消息不会丢失。

再均衡是 Kafka 消费者组维护整体的负载均衡和可用性的关键机制。

04消费者读取消息Offset

消费者读取消息的偏移量(Offset)是非常重要的,它用于跟踪已消费的消息位置。Kafka 使用 Offset 来确保消息的有序和不重复传递。

消费者 Offset 的作用
  1. 消息的位置:Offset 表示消费者在一个特定分区中的消息位置。它是一个整数值,每个分区都有自己的 Offset。

  2. 消息的偏移量:当消费者成功消费一条消息后,它需要将消息的 Offset 保存下来,以便下次继续消费新的消息。Offset 可以看作是消息队列中消息的偏移量。

重平衡和 Offset

在 Kafka 中,再均衡(Rebalance)是常见的操作,它可能会导致消费者被重新分配到不同的分区。在再均衡期间,Offset 仍然会被维护,但消费者需要小心处理 Offset,以确保消息不会被重复消费或遗漏。

相关文章:

Kafka入门04——原理分析

目录 01理解Topic和Partition Topic(主题) Partition(分区) 02理解消息分发 消息发送到分区 消费者订阅和消费指定分区 总结 03再均衡(rebalance) 再均衡的触发 分区分配策略 RangeAssignor(范围分区) RoundRobinAssignor(轮询分区) StickyAssignor(粘性分区) Re…...

k8s-----17、集群安全机制

1、集群安全机制概述 1.1 访问k8s的三个步骤 1、认证 2、鉴权(授权) 3、准入控制 进行访问的时候,过程中都需要经过apiserver,apiserver做统一协调,比如门卫。且访问过程中需要证书、token、或者用户名密码。如果需要访问pod,…...

蓝桥算法赛(铺地板)

问题描述 小蓝家要装修了,小蓝爸爸买来了很多块(你可以理解为数量无限) 23 规格的地砖,小蓝家的地板是 nm 规格的,小蓝想问你,能否用这些 23 的地砖铺满地板。 铺满地板:对于地板的每个区域&…...

浅谈AcrelEMS-GYM文体建筑能效管理解决方案-安科瑞 蒋静

1 概述 AcrelEMS-CA 文体建筑能效管理聚焦建筑的能量和信息的流向搭建平台解决方案。该系统解决方案集变电站综合自动化、电力监控、电能质量分析及治理、电气安全、能耗分析、照明控制、设备运维于一体。打破子系统孤立,配置方便,运维便捷;…...

在LayerUI中使用onChange事件监听复选框的值变化

在LayerUI中,你可以使用onChange事件监听复选框的值变化。当复选框的状态发生变化时,onChange事件会被触发。 以下是一个示例代码,演示了如何使用onChange事件监听复选框的值变化: jsx import React from react; import { Chec…...

决策树--ID3算法

决策树–ID3算法 概念 (1)信息熵 E n t r o p y ( x ) − ∑ i N c l a s s P ( x i ) l o g 2 P ( x i ) Entropy(x) -\sum_{i}^{N_{class}}P(x_i)log_2 P(x_i) Entropy(x)−i∑Nclass​​P(xi​)log2​P(xi​) 假设只有2个类别(N2&…...

js延时加载有哪些方式

...

VSCode运行python提示No module name ‘xxx‘

在进行from * import *导入操作时,编辑器能够解析到module, 但是在编辑器中运行时确提示。 No module name xxx 而且单独运行该文件,或在其他编辑器、或terminal中python file运行,都能正常导入module. 解决方案: 在vscode的用…...

【网安大模型专题10.19】※论文5:ChatGPT+漏洞定位+补丁生成+补丁验证+APR方法+ChatRepair+不同修复场景+修复效果(韦恩图展示)

Keep the Conversation Going: Fixing 162 out of 337 bugs for $0.42 each using ChatGPT 写在最前面背景介绍自动程序修复流程Process of APR (automated program repair)1、漏洞程序2、漏洞定位模块3、补丁生成4、补丁验证 (可以学习的PPT设计)经典的…...

C盘满了怎么清理文件?

电脑的C盘是我们电脑存储系统文件和应用程序的一个重要盘符,很多人经常会遇到C盘空间不足的问题;虽然我们可以通过卸载程序或者删除文件来释放空间,但是在这个过程中往往会误删掉一些重要的文件,造成部分程序可能无法正常使用。 因…...

pytest方法间变量值传递--request夹具

相当于self对象,因为调试的时候测试用例是类似沙箱的单步运行,所以self对象的属性被阻挡在沙箱外边。 request.cls 是pytest中的一个属性,它允许您在测试类中共享数据或属性。当您使用pytest编写测试类时,request 夹具允许您在测…...

Linux 内核定时器(高级字符设备五)

一、Linux 内核定时器介绍 在 Linux 内核中很多函数是基于定时器进行驱动的,但是内核定时器的精度并不高,所以不能作为高精度定时器使用。并且内核定时器的运行没有周期性,到达计时终点后会自动关闭。如果要实现周期性定时,就要在…...

「快学Docker」Docker镜像和容器的创建与管理

「快学Docker」Docker镜像和容器的创建与管理 引言什么是Docker镜像?镜像获取和使用镜像获取镜像使用 什么是Docker容器?Docker容器与主机之间的交互基于Dockerfile创建镜像基于镜像创建容器总结 引言 Docker镜像和容器是当今云计算领域中最受欢迎的技术…...

Zabbix出现 404Not FoundThe requested URL /zabbix was not found on this server.

目录 一、问题: 二、原因: 三、解决方法: 一、问题: Not Found The requested URL /zabbix was not found on this server. 二、原因: 未找到 在此服务器上找不到请求的 URL /zabbix。 /etc/httpd/conf.d 目录…...

【STM32】标准库的引入

一、为什么要会有标志外设库 1、传统单片机软件开发方式 (1)芯片厂商提供数据手册、示例代码、开发环境 (2)单片机软件工程师面向产品功能,查阅数据手册,参考官方示例代码进行开发 (3)硬件操作的方式是用C语言对寄存器进行读写以操作硬件 (4)主要工作量…...

Redis的淘汰策略

Redis是一种基于内存的高性能键值存储数据库,由于内存资源有限,当Redis中的数据量增大时,会导致内存占用过多,可能会影响系统的性能和稳定性。为了解决这个问题,Redis提供了一些淘汰策略来自动清理不再使用的key&#…...

Linux友人帐之日志与备份

一、日志 1.1概述 日志文件是重要的系统信息文件,其中记录了许多重要的系统事件,包括用户的登录信息、系统的启动信息、系统的安全信息、邮件相关信息、各种服务相关信息等。日志对于安全来说也很重要,它记录了系统每天发生的各种事情&#…...

git中如何在父仓库提交子仓库的修改

子仓库在父仓库中进行了修改,你需要按照以下步骤提交子仓库的修改: 切换到子仓库目录:使用cd命令进入子仓库所在的目录。拉取子仓库的最新更改:使用git pull命令拉取子仓库的最新更改,确保你的本地是最新的版本。提交…...

【【萌新的SOC学习之SD卡DMA回路读写大数据的实验】】

萌新的SOC学习之SD卡读写大数据的实验 记得先设定 FIFO 的位宽和深度 还有DMA 的大小 其他基本结构设计参照上一个SD卡读写小数据的实验 #include "xparameters.h" //包含vivado所导出的信息包含vivado的基地址 #include "xil_printf.h" //调用打印函…...

在k8s中 ,数据包是怎么从外部流转进入到pod的?

在 Kubernetes 中,当您创建 NodePort 类型的服务时,流量不会直接从主机的 IP 和端口转发到特定 Pod 的 IP 和端口。相反,流量被转发到集群中的一个节点,然后从那里转发到相应的 Pod。 1、当您创建 NodePort 类型的服务时&#xf…...

国防科技大学计算机基础课程笔记02信息编码

1.机内码和国标码 国标码就是我们非常熟悉的这个GB2312,但是因为都是16进制,因此这个了16进制的数据既可以翻译成为这个机器码,也可以翻译成为这个国标码,所以这个时候很容易会出现这个歧义的情况; 因此,我们的这个国…...

谷歌浏览器插件

项目中有时候会用到插件 sync-cookie-extension1.0.0:开发环境同步测试 cookie 至 localhost,便于本地请求服务携带 cookie 参考地址:https://juejin.cn/post/7139354571712757767 里面有源码下载下来,加在到扩展即可使用FeHelp…...

CVPR 2025 MIMO: 支持视觉指代和像素grounding 的医学视觉语言模型

CVPR 2025 | MIMO:支持视觉指代和像素对齐的医学视觉语言模型 论文信息 标题:MIMO: A medical vision language model with visual referring multimodal input and pixel grounding multimodal output作者:Yanyuan Chen, Dexuan Xu, Yu Hu…...

376. Wiggle Subsequence

376. Wiggle Subsequence 代码 class Solution { public:int wiggleMaxLength(vector<int>& nums) {int n nums.size();int res 1;int prediff 0;int curdiff 0;for(int i 0;i < n-1;i){curdiff nums[i1] - nums[i];if( (prediff > 0 && curdif…...

1.3 VSCode安装与环境配置

进入网址Visual Studio Code - Code Editing. Redefined下载.deb文件&#xff0c;然后打开终端&#xff0c;进入下载文件夹&#xff0c;键入命令 sudo dpkg -i code_1.100.3-1748872405_amd64.deb 在终端键入命令code即启动vscode 需要安装插件列表 1.Chinese简化 2.ros …...

React19源码系列之 事件插件系统

事件类别 事件类型 定义 文档 Event Event 接口表示在 EventTarget 上出现的事件。 Event - Web API | MDN UIEvent UIEvent 接口表示简单的用户界面事件。 UIEvent - Web API | MDN KeyboardEvent KeyboardEvent 对象描述了用户与键盘的交互。 KeyboardEvent - Web…...

GitHub 趋势日报 (2025年06月08日)

&#x1f4ca; 由 TrendForge 系统生成 | &#x1f310; https://trendforge.devlive.org/ &#x1f310; 本日报中的项目描述已自动翻译为中文 &#x1f4c8; 今日获星趋势图 今日获星趋势图 884 cognee 566 dify 414 HumanSystemOptimization 414 omni-tools 321 note-gen …...

前端开发面试题总结-JavaScript篇(一)

文章目录 JavaScript高频问答一、作用域与闭包1.什么是闭包&#xff08;Closure&#xff09;&#xff1f;闭包有什么应用场景和潜在问题&#xff1f;2.解释 JavaScript 的作用域链&#xff08;Scope Chain&#xff09; 二、原型与继承3.原型链是什么&#xff1f;如何实现继承&a…...

用docker来安装部署freeswitch记录

今天刚才测试一个callcenter的项目&#xff0c;所以尝试安装freeswitch 1、使用轩辕镜像 - 中国开发者首选的专业 Docker 镜像加速服务平台 编辑下面/etc/docker/daemon.json文件为 {"registry-mirrors": ["https://docker.xuanyuan.me"] }同时可以进入轩…...

Element Plus 表单(el-form)中关于正整数输入的校验规则

目录 1 单个正整数输入1.1 模板1.2 校验规则 2 两个正整数输入&#xff08;联动&#xff09;2.1 模板2.2 校验规则2.3 CSS 1 单个正整数输入 1.1 模板 <el-formref"formRef":model"formData":rules"formRules"label-width"150px"…...