Kafka 基础知识

news/2025/1/19 23:23:47/文章来源:https://www.cnblogs.com/wonchaofan/p/18239192

在数据事件流方面,Apache Kafka 是事实上的标准。它是一个由服务器和客户端组成的开源分布式系统。Apache Kafka 主要用于构建实时数据流管道。

Apache Kafka 被全球数以千计的领先组织用于高性能数据管道、流分析、数据集成和许多其他重要应用程序。

 在本节中,我们将学习所有基础知识并了解各种 Apache Kafka 组件,例如:

  • Kafka 主题

  • Kafka 生产者

  • Kafka 消费者

  • Kafka 消费者组和消费者偏移

  • Kafka 经纪人

  • Kafka 主题复制

  • Zookeeper

  • KRaft 模式

什么是 Kafka 主题?

Apache Kafka 被全球数以千计的领先组织用于高性能数据管道、流分析、数据集成和许多其他重要应用程序。

主题由其名称标识。例如,我们可能有一个名为日志的主题,其中可能包含来自我们应用程序的日志消息,还有另一个名为购买的主题,其中可能包含来自我们应用程序的购买数据。

 Kafka 主题可以包含任何格式的任何类型的消息,所有这些消息的序列称为数据流。

Kafka 主题中的数据默认在一周后删除(也称为默认消息保留期),此值是可配置的。这种删除旧数据的机制可确保 Kafka 集群不会因随着时间的推移回收主题而耗尽磁盘空间。

什么是 Kafka 分区?

主题被划分为多个分区。单个主题可能有多个分区,通常有 100 个分区。

主题的分区数是在创建主题时指定的。分区编号从 到 开始0N-1其中N是分区数。下图显示了一个包含三个分区的主题,每个分区的末尾都附加了消息。

 偏移量是 Kafka 在将每条消息写入分区时为其添加的一个整数值。给定分区中的每条消息都有一个唯一的偏移量。

Kafka 主题示例

 

 一家交通公司想要跟踪其卡车车队。每辆卡车都配备了 GPS 定位器,可将其位置报告给 Kafka。我们可以创建一个名为trucks_gps的主题,卡车会向该主题发布其位置。每辆卡车可以每 20 秒向 Kafka 发送一条消息,每条消息将包含卡车 ID 和卡车位置(纬度和经度)。该主题可以分成适当数量的分区,比如 10 个。该主题可能有不同的消费者。例如,一个在仪表板上显示卡车位置的应用程序或另一个在发生感兴趣的事件时发送通知的应用程序。

什么是 Kafka 偏移量?

Apache Kafka 偏移量表示消息在 Kafka 分区中的位置。每个分区的偏移量编号从开始,0并随着发送到特定 Kafka 分区的每条消息而递增。这意味着 Kafka 偏移量仅对特定分区有意义,例如,分区 0 中的偏移量 3 并不表示与分区 1 中的偏移量 3 相同的数据。

尽管我们知道 Kafka 主题中的消息会随着时间的推移而被删除(如上所示),但偏移量不会被重复使用。它们会以永无止境的序列不断增加。

Kafka 生产者

使用 Kafka 创建主题后,下一步就是将数据发送到主题。这就是 Kafka 生产者发挥作用的地方。

Kafka 生产者

将数据发送到主题的应用程序称为 Kafka 生产者。应用程序通常集成 Kafka 客户端库来写入 Apache Kafka。几乎所有当今流行的编程语言(包括 Python、Java、Go 等)都有出色的客户端库。

 

消息键

 

每个事件消息包含一个可选的键和一个值。

如果生产者未指定密钥 ( key=null),则消息将均匀分布在主题的各个分区中。这意味着消息以循环方式发送(分区p0,然后是p1 ,然后是p2,等等...然后返回p0等等...)。

如果发送了密钥key != null,则共享同一密钥的所有消息将始终发送并存储在同一个 Kafka 分区中。密钥可以是任何用于标识消息的内容 - 字符串、数值、二进制值等。

当需要对共享同一字段的所有消息进行消息排序时,通常使用 Kafka 消息键。例如,在跟踪车队中的卡车的场景中,我们希望卡车的数据在单个卡车级别上按顺序排列。在这种情况下,我们可以选择键为truck_id。在下面显示的示例中,ID 为truck_id_123 的卡车的数据将始终进入分区p0。

 您将在本页底部了解密钥散列的过程(确定哪个密钥属于哪个分区的过程)。

Kafka 消息剖析

Kafka 消息由生产者创建。Kafka 消息由以下元素组成:

 

  • Key。Kafka 消息中的 Key 是可选的,可以为空。Key 可以是字符串、数字或任何对象,然后 Key 被序列化为二进制格式。

  • 。值表示消息的内容,也可以为空。值的格式是任意的,然后也会序列化为二进制格式。

  • 压缩类型。Kafka 消息可能被压缩。压缩类型可以作为消息的一部分指定。选项包括nonegziplz4snappyzstd

  • 标头。可以以键值对的形式列出可选的 Kafka 消息标头。添加标头以指定有关消息的元数据是很常见的,尤其是对于跟踪而言。

  • 分区 + 偏移量。一旦消息被发送到 Kafka 主题,它就会收到一个分区号和一个偏移量 ID。主题+分区+偏移量的组合唯一地标识了该消息

  • 时间戳。时间戳由用户或系统添加到消息中。

Kafka 消息序列化器

在许多编程语言中,键和值都表示为对象,这大大提高了代码的可读性。但是,Kafka 代理希望将字节数组作为消息的键和值。将生产者对对象的编程表示转换为二进制的过程称为消息序列化

如下所示,我们有一条包含Integer键和String值的消息。由于键是整数,因此我们必须使用IntegerSerializer将其转换为字节数组。对于值,由于它是一个字符串,因此我们必须利用StringSerializer

 作为 Apache Kafka 的 Java 客户端 SDK 的一部分,已经存在多个序列化器,例如字符串(取代 JSON)、整数、浮点数。其他序列化器可能必须由用户编写,但常见的分布式 Kafka 序列化器已经存在,并且由于 Confluent Schema Registry 的存在,可以高效地为JSON-SchemaApache AvroProtobuf等格式编写。

好奇者:Kafka 消息密钥哈希

Kafka 分区器是一种代码逻辑,它获取记录并确定将其发送到哪个分区。

 因此,分区器通常会利用 Kafka 消息键将消息路由到特定主题分区。提醒一下,所有具有相同键的消息都将发送到同一个分区。

 

 

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

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

相关文章

python-数据分析-NumPy的应用-1、基础

1、安装python 数据分析的三大神器 pip install numpy pandas matplotlibNumpPy 的说明 Numpy 是一个开源的 Python 科学计算库,用于快速处理任意维度的数组。Numpy 支持常见的数组和矩阵操作、 对于同样的数值计算任务,使用 NumPy 不仅代码要简洁的多,而且 NumPy 在性能上也…

鸿蒙前端开发1-基本设置

1.AppScope>app.json5 中的icon和label设置,位置手机>设置>应用显示的图标和名称。标签值为字符串资源的索引,不能直接写名字,应该在字符串资源中设置 2.entry>configuration.json5中的icon和label设置的是应用安装后在桌面显示的图标和名称 3.

java第二次大作业blog

pta第二次博客 目录 • pta第二次博客 o 1.前言 o 2.设计与分析 o 3.踩坑心得: o 4.改进建议 o 5.总结1.前言 这三次题目集的主要考察的知识点是继承和多态,包括对super、extend关键字的使用,方法的重写等。 这三次PTA作业涉及了广泛的知识点,对日常学习积累的要求颇高。在…

什么是 Apache Kafka?

第一部分:数据集成挑战典型的企业通过各种应用程序收集数据,例如会计、计费、客户关系管理、网站等。这些应用程序中的每一个都有自己的数据输入和更新流程。为了获得业务的统一视图,工程师必须在这些不同的应用程序之间开发定制的集成。 这些直接积分可以得到如下所示的复杂…

关于nchu三次题目集7-1题目的总结

关于nchu三次题目集7-1题目的总结 一、前言 关于这三次的题目集,题目为家具强电器电路模拟程序,前提是在如今只能家具越来越流行的情况下,使用模拟程序控制智能家居强电器电路就很有必要,此次题目是考究的是我们对复杂问题的分析与处理能力,需要将串联电路以及并联电路模拟…

23201813-第二次pta-blog作业

前言: 在经过这一两个月的java学习,我对于java的认知和理解和刚开始学习的时候已经有很大不同,java可以更好的用面向对象技术来写程序,pta里的题每周都像一个小程序一样,就像是c语言的课设,每周一个,再加上我学艺不精,所以有的题目集没写或者没得到多少分,尤其是这三次…

Docker配置代理拉取镜像

国内环境越来越严峻,大部分国内镜像站都g了,因此记录一下Docker成功配置代理的步骤。运行以下命令,需要修改proxy.example.com:8080为你实际的代理地址sudo mkdir -p /etc/systemd/system/docker.service.d sudo tee /etc/systemd/system/docker.service.d/proxy.conf <&…

OOP第二次Blog

前言 (1) 第四次题集的第一题已经经过了三次迭代,需要考虑到的情况越来越复杂,难度也越来越大,这让我感受到面向对象编程的基本原则的重要性,此前每一次迭代都应该谨慎,切忌为了偷懒就破坏类之间的关系(我第二次迭代就偷懒过了所有测试点,然后最后一次就狂改)。 (2)…

Vue CLI 4与项目构建实战指南

这篇文章介绍了如何使用Vue CLI优化项目构建配置,提高开发效率,涉及配置管理、项目部署策略、插件系统定制以及Webpack和TypeScript的深度集成技巧。title: Vue CLI 4与项目构建实战指南 date: 2024/6/9 updated: 2024/6/9 excerpt: 这篇文章介绍了如何使用Vue CLI优化项目构…

2024.6.6学习java算法

java--- 对象赋值: 新建类class person包含String name和int age两个属性 在main方法中new person xiaoming,name为"xiaoming",age为19。 new person tiedan,tiedan=xiaoming。 输出tiedan的属性得到"xiaoming,19" tiedan.name="tiedan" 输出…

函数递归调用栈process

ret2text n步过 s步进 EIP所指的位置即为当前程序运行的位置gdb的栈地址顺序上高下底 s起始地址与ebp为0x18-0x08=0x10=16*bA 整数打包为字节 shellcode 我们现在做的很多题目,都是堆栈不可执行,如果要使堆栈可执行,就要用到修改内存属性的函数,这属于比较高级的利用方式,…

pwntool类型转换

pwntools:类型转换 编码是什么?编码就是把一个字符用一个二进制来表示。 以ASCII编码为例,它规定1个字节8个比特位代表1个字符的编码,也就是"00000000"这么宽,一个一个字节的解读。例如:01000001表示大写字母A,有时我们会“偷懒"的用65这个十进制来表示A…