kafka原理解析

news2025/1/13 21:49:57

一、基本概念与架构

  • 消息(Message):Kafka 中传递的数据单元,由消息头(可选)和消息体组成,消息体中包含了实际要传递的业务数据,例如用户的交易记录、日志信息等,通常以字节数组形式存在。
  • 主题(Topic):类似于文件夹的概念,是对消息进行分类的逻辑单元,生产者将消息发送到特定的主题,消费者从相应主题中订阅并获取消息。比如可以有 “订单主题”“日志主题” 等,不同类型的消息放在不同的主题下方便管理和处理。
  • 分区(Partition):为了实现数据的并行处理以及存储容量扩展等目的,每个主题可以划分成一个或多个分区。分区在物理上是独立存储的,一个分区内的消息是有序的,不同分区之间的消息顺序没有严格要求。例如,一个 “订单主题” 可以分为 3 个分区,这样可以同时处理多个分区内的订单消息,提高处理效率。
  • 生产者(Producer):负责产生消息并将消息发送到 Kafka 集群中指定的主题的客户端应用程序或组件。生产者可以根据业务需求决定消息的内容、发送的主题以及一些配置参数,比如消息的分区策略等。
  • 消费者(Consumer):从 Kafka 集群的主题中订阅并获取消息进行消费的客户端应用程序或组件。消费者可以是单个的实例,也可以组成消费者组(Consumer Group)来共同消费主题中的消息,以满足不同的业务场景需求。
  • 消费者组(Consumer Group):多个消费者组成的集合,它们共同消费同一个主题下的消息,同一消费者组内的消费者会协调合作,分摊消息的消费任务,不同消费者组之间相互独立,互不影响,并且可以重复消费相同主题下的消息。例如,在一个大数据分析系统中,不同的数据分析任务可以组成不同的消费者组,从 “日志主题” 中获取数据进行各自的分析。

二、消息存储与持久化原理

  • 日志(Log):Kafka 采用日志结构来存储消息,每个分区对应一个日志,日志由一系列的日志段(Log Segment)组成。日志段是实际存储消息的基本单元,在磁盘上以文件形式存在,通常包含了消息的偏移量(Offset)、消息大小、消息内容等信息。
  • 偏移量(Offset):是消息在分区日志中的唯一标识,它表示消息在分区内的相对位置,通过偏移量可以唯一确定一条消息,并且消费者可以根据偏移量来记录自己消费到的位置,便于后续继续从该位置进行消费或者实现消息的回溯等操作。例如,一个消费者已经消费到偏移量为 100 的消息,下次启动消费时就可以从偏移量 100 之后的消息开始继续消费。
  • 日志段管理:随着消息不断写入分区日志,当一个日志段达到一定的大小(如默认 1GB)或者一定的时间间隔(如默认 7 天)等条件时,会进行滚动(Roll)操作,即关闭当前日志段并开启新的日志段来继续存储后续的消息,旧的日志段会根据配置的保留策略决定是否删除,以实现磁盘空间的合理利用和消息的有效存储。

三、生产者发送消息原理

  • 分区策略(Partitioning Strategy)
    • 轮询策略(Round-robin):如果生产者没有指定消息发送到哪个分区,默认会采用轮询策略,将消息依次轮流发送到主题的各个分区中,保证每个分区接收到的消息数量大致相同,实现消息在分区间的均匀分布,适用于对消息顺序没有特殊要求的场景。
    • 随机策略(Random):按照随机的方式将消息分配到不同的分区,同样适用于对消息顺序要求不高的情况,不过在实际应用中相对轮询策略使用较少,因为其随机性可能导致分区负载不太均衡。
    • 基于键值的策略(Key-based):当生产者发送消息时,如果指定了消息的键(Key),Kafka 会根据键的哈希值(Hash)来确定消息应该发送到哪个分区,这样可以保证具有相同键的消息总是被发送到同一个分区中,便于后续对同键相关的消息进行顺序处理,例如对于同一个用户的多条订单消息,可以指定用户 ID 为键,使得该用户的所有订单消息都在同一个分区内按顺序存储和处理。
  • 消息发送确认机制(Acks)
    • acks = 0:生产者发送消息后,不等待任何来自 Kafka 集群的确认就认为消息发送成功,这种方式消息发送速度最快,但无法保证消息是否真正被 Kafka 集群接收和存储,存在消息丢失的风险,适用于对消息可靠性要求极低的场景,比如一些临时性的监控数据等。
    • acks = 1:生产者发送消息后,等待分区的主副本(Leader Replica)确认收到消息后就认为消息发送成功。这种方式能保证消息至少被主副本接收,但如果主副本还没来得及将消息同步到其他副本(Follower Replica)就出现故障,可能会导致消息丢失,不过相比于 acks = 0 可靠性有所提高,适用于对消息可靠性有一定要求但对一致性要求不是特别高的场景。
    • acks = all(或 -1):生产者发送消息后,会等待所有的副本(包括主副本和所有的副本)都确认收到消息后才认为消息发送成功,这是可靠性最高的确认方式,能保证消息在多个副本间都成功存储,但会牺牲一定的消息发送速度,适用于对消息可靠性和一致性要求都很高的场景,比如金融交易数据等。

四、消费者消费消息原理

  • 消费者组内协调机制(Consumer Group Coordination)
    同一消费者组内的消费者会通过与 Kafka 集群中的协调器(Coordinator)组件进行交互,协调各自的消费任务。协调器会根据主题的分区数量、消费者数量等因素来分配每个消费者负责消费的分区,例如,一个主题有 5 个分区,一个消费者组内有 3 个消费者,那么可能会有 2 个消费者分别负责 2 个分区,1 个消费者负责 1 个分区,通过这种方式实现消息消费的负载均衡,并且保证每个分区的消息只会被同一个消费者组内的一个消费者所消费。
  • 消息拉取模式(Pull Model)
    Kafka 采用消费者主动拉取消息的模式,消费者可以根据自己的处理能力和需求,决定何时从 Kafka 集群中拉取消息以及拉取多少消息。与传统的推送模式相比,拉取模式可以让消费者更好地控制消费的节奏,避免因消息推送过快而导致消费者处理不过来的情况,同时也便于消费者实现批量处理消息等功能,提高处理效率。不过,消费者需要合理设置拉取的时间间隔和消息数量等参数,以实现高效的消息消费。
  • 消息偏移量管理(Offset Management)
    消费者在消费消息的过程中,会记录自己所消费到的消息的偏移量,通过定期提交偏移量(可以是自动提交,也可以是手动提交,根据配置而定)到 Kafka 集群中的特定位置(如 Kafka 自带的偏移量主题等),告知集群自己已经消费到的位置,下次启动消费时,就可以基于上次提交的偏移量继续进行消费,实现消息的连续消费以及在出现故障等情况下的恢复消费等功能。例如,一个消费者在消费过程中突然崩溃,重启后它可以根据之前提交的偏移量接着消费,避免重复消费或遗漏消息。

五、分布式与高可用性原理

  • 副本机制(Replica)
    每个分区可以有多个副本,其中一个是主副本(Leader Replica),其余的是副本(Follower Replica)。主副本负责接收生产者发送的消息以及处理消费者的拉取请求,副本则会定期从主副本同步消息,保持与主副本数据的一致性。当主副本出现故障时,Kafka 集群会从副本中选举出一个新的主副本继续工作,保证分区的正常运行,从而实现了数据的冗余和高可用性,例如,在一个拥有 3 个副本的分区中,如果主副本所在的服务器宕机,集群可以迅速从另外 2 个副本中选择一个作为新的主副本,确保消息的生产和消费不受太大影响。
  • 控制器(Controller)
    Kafka 集群中有一个控制器组件,它负责整个集群的管理和协调工作,比如监控分区和副本的状态、进行主副本的选举、协调主题和分区的创建与删除等操作。控制器通过与集群中的各个 Broker(Kafka 服务器实例)进行通信,获取它们的状态信息,然后根据这些信息做出相应的决策并下达指令,确保集群的正常运行和数据的一致性,例如,当检测到某个分区的主副本故障时,控制器会启动选举程序选出新的主副本,并通知相关的 Broker 进行相应的角色转换和数据同步等操作。

六、性能优化相关原理

  • 零拷贝技术(Zero-copy)
    Kafka 在消息传递过程中运用了零拷贝技术,减少了数据在内存和磁盘之间以及不同网络层之间的拷贝次数,从而降低了数据传输的延迟,提高了传输效率。传统的数据传输方式可能需要多次拷贝数据,比如从磁盘读取数据到内核缓冲区,再拷贝到用户缓冲区,然后再拷贝到网络缓冲区等,而零拷贝技术可以直接将磁盘数据映射到网络缓冲区,省略了中间的一些拷贝环节,使得消息能够更快地从生产者发送到消费者。
  • 批量发送与接收(Batch Send and Receive)
    生产者可以将多条消息进行批量发送,将多个小的消息合并成一个较大的消息批次,这样可以减少网络传输的次数,提高网络带宽的利用率,因为每次网络传输都有一定的开销,批量发送可以分摊这些开销。同样,消费者也可以批量接收消息,一次性处理多条消息,提高处理效率,例如,生产者可以每隔一段时间或者当消息数量达到一定阈值时,将积累的消息批量发送到 Kafka 集群,消费者在拉取消息时也可以一次性拉取多条消息进行处理。

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

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

相关文章

apollo内置eureka dashboard授权登录

要确保访问Eureka Server时要求输入账户和密码,需要确保以下几点: 确保 eurekaSecurityEnabled 配置为 true:这个配置项控制是否启用Eureka的安全认证。如果它被设置为 false,即使配置了用户名和密码,也不会启用安全认…

一学就废|Python基础碎片,文件读写

文件处理是指通过编程接口对文件执行诸如创建、打开、读取、写入和关闭等操作的过程。它涉及管理程序与存储设备上的文件系统之间的数据流,确保数据得到安全高效的处理。 Python 中的文件模式 打开文件时,我们必须指定我们想要的模式,该模式…

【计算机网络】lab7 TCP协议

🌈 个人主页:十二月的猫-CSDN博客 🔥 系列专栏: 🏀计算机网络_十二月的猫的博客-CSDN博客 💪🏻 十二月的寒冬阻挡不了春天的脚步,十二点的黑夜遮蔽不住黎明的曙光 目录 1. 实验目的…

Ollama VS LocalAI:本地大语言模型的深度对比与选择指南

随着人工智能技术的快速发展,大语言模型逐渐成为多个行业的重要工具。从生成内容到智能问答,大模型展现了强大的应用潜力。然而,云端模型的隐私性、使用成本和网络依赖等问题也促使更多用户关注本地化解决方案。Ollama 和 LocalAI 是近年来备…

Python中定位包含特定文本信息的元素

目录 一、为什么需要定位包含文本信息的元素 二、使用Selenium定位包含文本的元素 1. 使用find_element_by_link_text 2. 使用find_element_by_partial_link_text 3. 使用XPath定位包含文本的元素 4. 使用CSS选择器定位包含文本的元素 三、使用BeautifulSoup定位包含文本…

【数据结构】第1天之Java中的数据结构

前言 众所周知,程序数据结构算法,可见数据结构的重要性。 在Java中,数据结构通常指的是Java集合框架中的类和接口。 Java集合框架提供了一套标准的数据结构,例如列表、集合、映射表等,以及相应的实现类。 今天要分享的…

OpenCV的对比度受限的自适应直方图均衡化算法

OpenCV的对比度受限的自适应直方图均衡化(CLAHE)算法是一种图像增强技术,旨在改善图像的局部对比度,同时避免噪声的过度放大。以下是CLAHE算法的原理、步骤以及示例代码。 1 原理 CLAHE是自适应直方图均衡化(AHE&…

【赵渝强老师】什么是NoSQL数据库?

随着大数据技术的兴起,NoSQL数据库得到了广泛的应用。NoSQL的全称是Not Only SQL,中文含义是不仅仅是SQL。它泛指所有的非关系型数据库,即:在NoSQL数据库中存储数据的模型可能不是二维表的行和列。NoSQL数据库不遵循关系型数据库范…

Linux第一个系统程序---进度条

进度条---命令行版本 回车换行 其实本质上回车和换行是不同概念,我们用一张图来简单的理解一下: 在计算机语言当中: 换行符:\n 回车符:\r \r\n:回车换行 这时候有人可能会有疑问:我在学习C…

于交错的路径间:分支结构与逻辑判断的思维协奏

大家好啊,我是小象٩(๑ω๑)۶ 我的博客:Xiao Xiangζั͡ޓއއ 很高兴见到大家,希望能够和大家一起交流学习,共同进步。* 这一节内容很多,文章字数达到了史无前例的一万一,我们要来学习分支与循环结构中…

【学习笔记】理解深度学习和机器学习的数学基础:数值计算

深度学习作为人工智能领域的一个重要分支,其算法的实现和优化离不开数值计算。数值计算在深度学习中扮演着至关重要的角色,它涉及到如何在计算机上高效、准确地解决数学问题。本文将介绍深度学习中数值计算的一些关键概念和挑战,以及如何应对…

DolphinScheduler自身容错导致的服务器持续崩溃重大问题的排查与解决

01 问题复现 在DolphinScheduler中有如下一个Shell任务: current_timestamp() { date "%Y-%m-%d %H:%M:%S" }TIMESTAMP$(current_timestamp) echo $TIMESTAMP sleep 60 在DolphinScheduler将工作流执行策略设置为并行: 定时周期调度设置…

Python学习(三)基础入门(数据类型、变量、条件判断、模式匹配、循环)

目录 一、第一个 Python 程序1.1 命令行模式、Python 交互模式1.2 Python的执行方式1.3 SyntaxError 语法错误1.4 输入和输出 二、Python 基础2.1 Python 语法2.2 数据类型1)Number 数字2)String 字符串3)List 列表4)Tuple 元组5&…

LLM - Llama 3 的 Pre/Post Training 阶段 Loss 以及 logits 和 logps 概念

欢迎关注我的CSDN:https://spike.blog.csdn.net/ 本文地址:https://spike.blog.csdn.net/article/details/145056912 Llama 3 是 Meta 公司发布的开源大型语言模型,包括具有 80 亿和 700 亿参数的预训练和指令微调的语言模型,支持…

[RabbitMQ] RabbitMQ运维问题

🌸个人主页:https://blog.csdn.net/2301_80050796?spm1000.2115.3001.5343 🏵️热门专栏: 🧊 Java基本语法(97平均质量分)https://blog.csdn.net/2301_80050796/category_12615970.html?spm1001.2014.3001.5482 🍕 Collection与…

MongoDB如何使用

1.简单介绍 MongoDB是一个开源、高性能、无模式的文档型数据库,当初的设计就是用于简化开发和方便扩展,是NoSQL数据库产品中的一种。是最 像关系型数据库(MySQL)的非关系型数据库。 MongoDB是一个基于分布式文件存储的数据库由C语…

【2024年华为OD机试】(C卷,100分)- 分割均衡字符串 (Java JS PythonC/C++)

一、问题描述 题目描述 均衡串定义:字符串中只包含两种字符,且这两种字符的个数相同。 给定一个均衡字符串,请给出可分割成新的均衡子串的最大个数。 约定:字符串中只包含大写的 X 和 Y 两种字符。 输入描述 输入一个均衡串…

React Fiber框架中的Commit提交阶段——commitMutationEffect函数

Render阶段 Render阶段可大致归为beginWork(递)和completeWork(归)两个阶段 1.beginWork流程(递) 建立节点的父子以及兄弟节点关联关系 child return sibling属性给fiber节点打上flag标记(当前节点的flag) …

【STM32-学习笔记-6-】DMA

文章目录 DMAⅠ、DMA框图Ⅱ、DMA基本结构Ⅲ、不同外设的DMA请求Ⅳ、DMA函数Ⅴ、DMA_InitTypeDef结构体参数①、DMA_PeripheralBaseAddr②、DMA_PeripheralDataSize③、DMA_PeripheralInc④、DMA_MemoryBaseAddr⑤、DMA_MemoryDataSize⑥、DMA_MemoryInc⑦、DMA_DIR⑧、DMA_Buff…

IoT平台在设备远程运维中的应用

IoT平台是物联网技术的核心组成部分,实现了设备、数据、应用之间的无缝连接与交互。通过提供统一的设备管理、数据处理、安全监控等功能,IoT平台为企业构建了智能化、可扩展的物联网生态系统。在设备远程运维领域,IoT平台发挥着至关重要的作用…