Kafka入门指南:从零开始掌握分布式消息队列

为什么要有消息队列

生活中有这样的场景
在这里插入图片描述
快递员将包裹送给买家。
我记得在小时候,收快递是需要快递员电话联系上门时间的。这非常不方便,一方面快递员手中可能有多个包裹,另一方面买家可能在上班时间抽不出身。
后来有了驿站,快递员只需要将包裹放入驿站,并通知买家按时取走。这种模式便捷了快递员和买家双方。在这里插入图片描述
驿站的作用类似于“中间件”,它的出现有这些好处
1.解耦系统组件
快递员和收货人无需接触也能完成事件,解放了快递员和收货人的时间。
2.异步处理
异步允许事情独立发生,相互之间不需要等待对方完成。快递员不需要询问收货人是否在家,收货人不需要等待快递员上门。
3.流量削峰
收货人不用面对多个快递同时抵达在不同位置的尴尬情况。
4.失败重试与可靠性
允许收货人因特殊原因当天无法取件(处理失败),驿站可以将包裹保留几日。

消息队列通信的模式

上面的例子中引出了“中间件”的概念,驿站就类似于消息队列,但消息队列有不同模式。

两种模式

1.点对点模式
在这里插入图片描述
Producer将Message放于Queue中,Consumer从中拉取信息。该模式下,发送到队列的消息被一个且只有一个消费者进行处理,消费者主动拉取消息的好处是频率可控,弊端是消费者不知是否有未处理的信息。
2.发布-订阅模式
在这里插入图片描述
该模式类似于公众号,新消息发送给所有关注的用户。消费者无需考虑是否有未处理的消息。弊端是消费者之间性能的差异带来的木桶效应,如Consumer1的处理速度为10,而Consumer2的处理速度为3,最后的推送速度只能小于3。但这极大浪费了Cinsumer1的性能。

Kafka

Kafka 本质上是一个 基于发布/订阅模型 的消息系统。作为一种高吞吐、可水平扩展、持久化、分布式提交日志服务。要想理解Kafka我们要先知道其基础架构及术语。

基础架构及术语

在这里插入图片描述

Broker

Broker是Kafka中的单个服务器节点,一个Kafka可以包含多个Broker,多个Broker组成Kafka集群。每个Broker都可以处理一部分数据(消息的接收、存储、传输)

Topic

消息的逻辑类别或数据流名称。对消息进行分类和组织,可以把它想象成文件夹名称。

Partition

是Topic的分区,一个Topic可能有多个分区。Partition 是 Kafka 实现并行处理和高吞吐的关键。生产者和消费者可以并行地与多个 Partition 交互。

Replica

Partition 的副本。每个 Partition 可以有多个 Replica,分布在不同的Broker上,用于容错。

Leader Replica/Follower Replica

每个 Partition 在某一时刻只有一个 Leader。所有针对该 Partition 的读写请求(生产和消费)都必须由 Leader 处理。
从 Leader Replica 复制数据。如果 Leader 失效,其中一个 Follower 会被选举为新的 Leader。

In-Sync Replica (ISR)

指那些与 Leader Replica 保持足够同步的 Replica 集合(包括 Leader 自身)。只有 ISR 中的 Follower 才有资格在 Leader 失效时被选举为新的 Leader。

Producer

向 Kafka Topic 发布消息的客户端应用程序,即是生产者,是消息的入口。

Consumer

从 Kafka Topic 订阅并读取消息的客户端应用程序,即是消费者,是消息的出口。

Consumer Group

将多个消费组组成一个消费者组。同一个分区的数据只能被消费者组中某一个用户消费,同一个消费者组的消费者可以在同一个Topic上消费不同分区(并行)。

ZooKeeper

Kafka 集群依赖 ZooKeeper 集群来存储和管理关键的元数据。

流程分析

发送数据

写入数据时,Producer先找到Leader,将数据写入Leader。这个过程展开来说如此:
1.将消息发给Leader
2.Leader写入数据
3.Follower同步Leader的消息
4.Follower发送ack表示同步完成
5.Leader收到所有Follwer的ack后向Producer发送ack,表示过程结束

ack是什么?
acks(Acknowledgments)是生产者(Producer)配置的核心参数之一,用于控制消息写入的可靠性级别。 它决定了生产者认为消息“成功发送”之前,需要多少个分区副本(Replica)确认收到该消息。
通常ack有三种配置:0、1、all

0代表不等待确认,生产者发送消息后立即认为成功,不等待Broker回应。可靠性最低但效率最高。
1代表Leader确认,生产者等待Leader将消息写入本地。可靠性和效率都是中等。
all代表全副本确认,等待ISR中所有副本都成功写入消息。可靠性最高但效率最低。

保存数据

Kafka会单独开辟一块磁盘空间,顺序写入数据。

Partition 结构

每个 Partition 是一个 追加写入的日志文件(Append-only Log),存储在磁盘上。Kafka 使用日志文件来持久化消息,每个 Partition 对应一个目录,目录下包含多个日志文件(Segment)。

<topic-name>-<partition-id>/
├── 00000000000000000000.index
├── 00000000000000000000.log
├── 00000000000000000000.timeindex
├── 00000000000000000001.index
├── 00000000000000000001.log
├── 00000000000000000001.timeindex
└── ...

Partition 的选择策略

当生产者发送消息到某个 Topic 时,Kafka 会根据以下策略选择将消息写入哪个 Partition:
1.指定 Partition:生产者可以显式指定 Partition
2.Key Hash:如果消息有 Key,则默认使用 Key 的 Hash 值取模 Partition 数量
3.轮询:没有 Key 时,默认轮询方式分配 Partition

数据保留策略

Kafka可以通过配置来设置数据的保留策略,包括基于时间的保留(如7天)和基于大小的保留(如1GB)。一旦数据超过了这些限制,就会被删除以释放空间。

消费数据

Kafka支持点对点和发布订阅两种模式。当单个消费者时,采取类似点对点模式;消费群组时,采用发布订阅模式。
前文提到过多个消费者组成的消费者组,每个消费者组有其独特的编号,同一个消费者组的消费者可以消费同一Topic下不同分区的数据,但是不会组内多个消费者消费同一分区的数据。

如果消费者数量和分区数量不一致:
消费者数量<分区数量 —— 有的消费者会消费多个分区,效率低于消化单个分区的消费者
消费者数量>分区数量 —— 多出来的消费者不消化数据

查找数据

Kafka 的查找数据过程是其高性能和高吞吐量的核心机制之一。Kafka 通过稀疏索引、日志段(Log Segment) 和 二分查找算法 实现高效的数据检索。
Kafka查找数据过程分为两个主要步骤:

  1. 定位目标日志段(Log Segment)
  2. 在日志段中查找具体消息

定位日志段

是 Kafka 存储消息的基本单元,每个 Partition 被划分为多个日志段(00000000000000000000.log 和 00000000000000000099.log)。

第一个日志段的起始偏移量为 0,后续日志段的起始偏移量为上一个日志段的最后一条消息的 offset。

Kafka使用二分查找算法在日志段列表中定位目标。

offset

即是偏移量,用于标识消息在 Kafka 分区(Partition)中的唯一位置。它是 Kafka 实现消息顺序性、消费进度追踪和数据可靠性管理的关键机制。
它有如下作用:
1.标识消息在分区中的位置
2.保证消息在分区内有序性
3.跟踪消费者的消费进度

查找具体消息

Kafka 的每个日志段包含两个关键文件:.log 文件 和.index 文件(稀疏索引)

稀疏索引:每隔一定字节数(默认 4KB)为一条消息创建索引项。如1、2、3、4、5… ——> 1、3、5…

整体流程概括为:稀疏索引 + 二分查找 + 顺序写入 + 内存映射

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

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

相关文章

基于Matlab图像处理的瓶子自动检测与质量评估系统

本文提出了一种基于图像处理的瓶子缺陷检测系统&#xff0c;旨在通过图像分析自动识别和检测瓶子在生产过程中可能出现的缺陷。系统首先通过图像预处理技术&#xff0c;包括灰度转换、二值化处理、噪声去除等步骤&#xff0c;将原始图像转换为适合分析的格式。然后&#xff0c;…

【Pandas】pandas Index objects Index.name

Pandas2.2 Index objects Properties方法描述Index.values返回 Index 对象的值&#xff0c;通常是一个 NumPy 数组Index.is_monotonic_increasing用于检查索引的元素是否 单调递增Index.is_monotonic_decreasing用于判断索引的值是否 单调递减Index.is_unique用于检查索引中的标…

JDBC教程,2025版最新讲解.超详细入门教程

以下内容全面详尽地梳理了 JDBC &#xff08;Java Database Connectivity&#xff09;的核心知识点&#xff0c;并在关键环节配以示例代码。若要快速定位&#xff0c;可先查看下方结构&#xff1a; JDBC 概览驱动加载与注册获取数据库连接执行 SQL&#xff08;Statement、Prepa…

PyTorch中nn.Module详解和综合代码示例

在 PyTorch 中&#xff0c;nn.Module 是神经网络中最核心的基类&#xff0c;用于构建所有模型。理解并熟练使用 nn.Module 是掌握 PyTorch 的关键。一、什么是 nn.Module nn.Module 是 PyTorch 中所有神经网络模块的基类。可以把它看作是“神经网络的容器”&#xff0c;它封装了…

深入解析三大Web安全威胁:文件上传漏洞、SQL注入漏洞与WebShell

文章目录文件上传漏洞SQL注入漏洞WebShell三者的核心关联&#xff1a;攻击链闭环文件上传漏洞 文件上传漏洞&#xff08;File Upload Vulnerability&#xff09; 当Web应用允许用户上传文件但未实施充分的安全验证时&#xff0c;攻击者可上传恶意文件&#xff08;如WebShell、…

【对比】群体智能优化算法 vs 贝叶斯优化

在机器学习、工程优化和科学计算中&#xff0c;优化算法的选择直接影响问题求解的效率与效果。群体智能优化算法&#xff08;Swarm Intelligence, SI&#xff09;和贝叶斯优化&#xff08;Bayesian Optimization, BO&#xff09;是两种截然不同的优化范式&#xff0c;分别以不同…

LLMs之Agent:ChatGPT Agent发布—统一代理系统将研究与行动无缝对接,开启智能助理新时代

LLMs之Agent&#xff1a;ChatGPT Agent发布—统一代理系统将研究与行动无缝对接&#xff0c;开启智能助理新时代 目录 OpenAI重磅发布ChatGPT Agent—统一代理系统将研究与行动无缝对接&#xff0c;开启智能助理新时代 第一部分&#xff1a;Operator 和深度研究的自然演进 第…

Linux726 raid0,raid1,raid5;raid 创建、保存、停止、删除

RAID创建 创建raid0 安装mdadm yum install mdadm mdadm --create /dev/md0 --raid-devices2 /dev/sdb5 /dev/sdb6 [rootsamba caozx26]# mdadm --create /dev/md0 --raid-devices2 /dev/sdb3 /dev/sdb5 --level0 mdadm: Defaulting to version 1.2 metadata mdadm: array /dev…

深入剖析 MetaGPT 中的提示词工程:WriteCode 动作的提示词设计

今天&#xff0c;我想和大家分享关于 AI 提示词工程的文章。提示词&#xff08;Prompt&#xff09;是大型语言模型&#xff08;LLM&#xff09;生成高质量输出的关键&#xff0c;而在像 MetaGPT 这样的 AI 驱动软件开发框架中&#xff0c;提示词的设计直接决定了代码生成的可靠…

关于 ESXi 中 “ExcelnstalledOnly 已禁用“ 的解决方案

第一步&#xff1a;使用ssh登录esxi esxcli system settings advanced list -o /User/execInstalledOnly可能会得到以下内容 esxcli system settings advanced list -o /User/execInstalledOnlyPath: /User/ExecInstalledOnlyType: integerInt Value: 0Default Int Value: 1Min…

HTML5 Canvas 绘制圆弧效果

HTML5 Canvas 绘制圆弧效果 以下是一个使用HTML5 Canvas绘制圆弧的完整示例&#xff0c;你可以直接在浏览器中运行看到效果&#xff1a; <!DOCTYPE html> <html lang"zh-CN"> <head><meta charset"UTF-8"><meta name"view…

智能Agent场景实战指南 Day 18:Agent决策树与规划能力

【智能Agent场景实战指南 Day 18】Agent决策树与规划能力 开篇 欢迎来到"智能Agent场景实战指南"系列的第18天&#xff01;今天我们将深入探讨智能Agent的核心能力之一&#xff1a;决策树与规划能力。在现代业务场景中&#xff0c;Agent需要具备类似人类的决策能力…

AI 编程工具 Trae 重要的升级。。。

大家好&#xff0c;我是樱木。 今天打开 Trae &#xff0c;已经看到它进行图标升级&#xff0c;之前的图标&#xff0c;国际和国内版本长得非常像&#xff0c;现在做了很明显的区分&#xff0c;这点给 Trae 团队点个赞。 自从 Claude 使出了压力以来&#xff0c;Cursor 锁区&…

排序算法,咕咕咕

1.选择排序void selectsort(vector<int>& v) { for(int i0;i<v.size()-1;i) {int minii;for(int ji1;j<v.size();j){if(v[i]>v[j]){minij;}}if(mini!i)swap(v[i],v[mini]); } }2.堆排序void adjustdown(vector<int>& v,int root,int size) { int …

数据库查询系统——pyqt+python实现Excel内查课

一、引言 数据库查询系统处处存在&#xff0c;在教育信息化背景下&#xff0c;数据库查询技术更已深度融入教务管理场景。本系统采用轻量化架构&#xff0c;结合Excel课表&#xff0c;通过PythonPyQt5实现跨平台桌面应用&#xff0c;以实现简单查课效果。 二、GUI界面设计 使用…

base64魔改算法 | jsvmp日志分析并还原

前言 上一篇我们讲了标准 base64 算法还原&#xff0c;为了进一步学习 base64 算法特点&#xff0c;本文将结合 jsvmp 日志&#xff0c;实战还原出 base64 魔改算法。 为了方便大家学习&#xff0c;我将入参和上篇文章一样&#xff0c;入参为 Hello, World!。 插桩 在js代码中&…

vue3笔记(2)自用

目录 一、作用域插槽 二、pinia的使用 一、Pinia 基本概念与用法 1. 安装与初始化 2. 创建 Store 3. 在组件中使用 Store 4. 高级用法 5、storeToRefs 二、Pinia 与 Vuex 的主要区别 三、为什么选择 Pinia&#xff1f; 三、定义全局指令 1.封装通用 DOM 操作&#…

大模型面试回答,介绍项目

1. 模型准备与转换&#xff08;PC端/服务器&#xff09;你先在PC上下载或训练好大语言模型&#xff08;如HuggingFace格式&#xff09;。用RKLLM-Toolkit把模型转换成瑞芯微NPU能用的专用格式&#xff08;.rkllm&#xff09;&#xff0c;并可选择量化优化。把转换好的模型文件拷…

Oracle 19.20未知BUG导致oraagent进程内存泄漏

故障现象查询操作系统进程的使用排序&#xff0c;这里看到oraagent的物理内存达到16G&#xff0c;远远超过正常环境&#xff08;正常环境在19.20大概就是100M多一点&#xff09;[rootorastd tmp]# ./hmem|more PID NAME VIRT(kB) SHARED(kB) R…

尝试几道算法题,提升python编程思维

一、跳跃游戏题目描述&#xff1a; 给定一个非负整数数组 nums&#xff0c;你最初位于数组的第一个下标。数组中的每个元素代表你在该位置可以跳跃的最大长度。判断你是否能够到达最后一个下标。示例&#xff1a;输入&#xff1a;nums [2,3,1,1,4] → 输出&#xff1a;True输入…