Kafka-初识

一、Kafka是什么?

Kafka是一个高度可扩展、弹性、容错和安全的分布式流处理平台,由服务器和客户端组成,通过高性能TCP网络协议进行通信。它可以像消息队列一样生产和消费数据。可以部署在裸机硬件、虚拟机和容器上,也可以部署在本地和云中。

二、名词解析

1、事件(Event)

事件记录了世界上或企业中“发生了一些事情“的事实。它也被称为留档中的记录或消息。当向Kafka读取或写入数据时,以事件的形式执行此操作。从概念上讲,事件具有键、值、时间戳和可选的元数据头。下面是一个示例事件:

Event key :Alice

Event value: 向Bob支付了200美元

Event timestamp:2024年10月8日下午2:06

2、事件流(Event Streaming)

事件流是以事件流的形式从数据库、传感器、移动设备、云服务和软件应用程序等事件源实时捕获数据的做法;持久地存储这些事件流以供以后检索;实时和回顾性地操纵、处理和响应事件流;并根据需要将事件流路由到不同的目的地技术。因此,事件流确保了数据的连续流动和解释,以便在正确的时间将正确的信息放在正确的位置。

我们可以将事件流用于一系列实时场景,比如实时支付、实时跟踪和监控、实时反馈等

3、Kafka服务器

Kafka作为一个或多个服务器的集群运行,这些服务器可以跨越多个数据中心或云区域。其中一些服务器构成了存储层,称为代理。其他服务器运行Kafka Connect,以连续导入和导出数据作为事件流,将Kafka与现有系统(如关系数据库和其他Kafka集群)集成。为了让你实现关键任务用例,Kafka集群具有高度的可扩展性和容错性:如果它的任何服务器发生故障,其他服务器将接管它们的工作,以确保连续运行而不会丢失任何数据。

Kafka服务器也是一个主从架构,一个Kafka有一个或多个Broker,其中有一个Broker会依赖Zookeeper被选举为Controller。Controller负责管理集群中所有分区和副本状态。

4、Kafka客户端

它们允许我们编写分布式应用程序和微服务,即使在网络问题或机器故障的情况下,也能并行、大规模、容错地读取、写入和处理事件流。Kafka附带了一些这样的客户端,这些客户端由Kafka社区提供的数十个客户端增强:客户端可用于Java和Scala,包括更高级别的Kafka Streams库,用于Go、Python、C/C++和许多其他编程语言以及REST API。

4.1、生产者(Producer)

生产者是那些向Kafka发布(写入)事件的客户端应用程序

4.2、消费者(Consumer)

消费者是那些订阅(读取和处理)这些事件的应用程序

在Kafka中,生产者和消费者是完全解耦的,彼此不可知,这是实现Kafka众所周知的高可扩展性的关键设计元素。例如,生产者永远不需要等待消费者。Kafka提供了各种保证,例如能够只处理一次事件。

5、主题(topic)

事件被组织并持久地存储在主题中。非常简单,主题类似于文件系统中的文件夹,事件就是该文件夹中的文件。例如主题名称可以是“付款”。Kafka中的主题总是多生产者和多订阅者的:一个主题可以有零个、一个或多个生产者向其写入事件,也可以有零、一个、或多个消费者订阅这些事件。主题中的事件可以根据需要随时读取——与传统的消息传递系统不同,事件在使用后不会被删除。相反,您可以通过按主题配置设置来定义Kafka应该保留事件多长时间,之后旧事件将被丢弃。Kafka的性能在数据大小方面实际上是恒定的,因此长时间存储数据是完全可以的。

6、分组(group)

该分组是针对消费者来分组,每个consumer都属于一个特定的组,多个consumer可以共同消息一个Topic下的消息。每个consumer消费其中的部分分区数据。

7、分区 (partition)

主题(topic)是分区的,这意味着一个主题分布在位于不同Kafka代理上的多个“桶”上。这种数据的分布式放置对于可扩展性非常重要,因为它允许客户端应用程序同时从多个代理读取数据和向多个代理写入数据。当一个新事件发布到一个主题时,它实际上会附加到该主题的一个分区上。具有相同事件密钥(例如,客户或车辆ID)的事件被写入同一分区,Kafka保证给定主题分区的任何消费者将始终以与写入顺序完全相同的顺序读取该分区的事件。

下面的官网上的解释图:

从图中可以看出:该主题有四个分区P1-P4。两个不同的生产者客户端通过网络将事件写入主题的分区,彼此独立地向主题发布新事件。具有相同键的事件(在图中用它们的颜色表示)被写入同一个分区。请注意,如果合适,两个生产者都可以写入同一个分区。

8、副本(replicated)

为了使数据具有容错性和高可用性,每个主题都可以复制,甚至可以跨地理区域或数据中心复制,这样总有多个代理拥有数据副本,以防出现问题、您想对代理进行维护等等。常见的生产设置是复制系数为3,即您的数据总是有三个副本。此复制在主题分区级别执行。

请注意:这里的副本是用来提高容错和高可用的,并不是用来提升读写性能的,因此读写只发生在主的那份数据上。

9、偏移量(Offset 

偏移量是针对分区的,是consumer在对应分区消费的水位线

三、API

1、 Admin API:用于管理和检查主题、代理和其他Kafka对象

2、Producer API:将事件流发布(写入)到一个或多个Kafka主题

3、Consumer API:用于订阅(读取)一个或多个主题并处理产生给它们的事件流

4、Kafka Streams API:用于实现流处理应用程序和微服务。它提供了更高级的函数来处理事件流,包括转换、聚合和连接等有状态操作、窗口、基于事件时间的处理等。从一个或多个主题读取输入,以生成对一个或更多主题的输出,从而有效地将输入流转换为输出流。

5、Kafka Connect API:用于构建和运行可重复使用的数据导入/导出连接器,这些连接器消耗(读取)或生成(写入)来自外部系统和应用程序的事件流,以便与Kafka集成。例如,像PostgreSQL这样的关系数据库的连接器可能会捕获一组表的每一个更改。然而,在实践中,通常不需要实现自己的连接器,因为Kafka社区已经提供了数百个即用型连接器。

四:入门小例子

下面我们用官网给的快速入门小例子来实践下,为了方便我使用cdh安装了Kafka

1、创建一个主题(topic)来存储事件

Kafka是一个分布式事件流平台,可让您读取、写入、存储和处理 事件(也称为记录或 留言在留档) 跨许多机器。

事件是支付交易、来自手机的地理位置更新、运输订单、传感器测量 来自物联网设备或医疗设备等等。这些事件被组织和存储在 主题。 非常简化,主题类似于文件系统中的文件夹,事件是该文件夹中的文件。

因此,在编写第一个事件之前,我们必须创建一个主题。打开一个终端窗口并运行:

kafka-topics --create --topic quickstart-events --bootstrap-server cdh1:9092 --partitions 2 --replication-factor 2

结果:

 查看topic列表

kafka-topics -list --zookeeper cdh1:2181

结果:

 查看topic详情

kafka-topics --describe --zookeeper cdh1:2181 --topic quickstart-events

结果:

调整topic分区数

kafka-topics --zookeeper cdh1:2181 --alter --topic quickstart-events --partitions 3

 结果:

查看 topic 指定分区 offset

kafka-run-class kafka.tools.GetOffsetShell --topic quickstart-events  --time -1 --broker-list cdh1:9092 --partitions 0 

 结果:

 删除topic

kafka-topics --create --topic quickstart-temp --bootstrap-server cdh1:9092 --partitions 2 --replication-factor 2
kafka-topics --delete --zookeeper cdh1:2181 --topic quickstart-temp

结果:

2、向主题(topic)写入事件

Kafka客户端通过网络与Kafka代理通信以写入(或读取)事件。一旦收到,代理将以持久和容错的方式存储事件,只要您需要-甚至可以永远存储。

运行控制台生产者客户端以将一些事件写入刚刚新建的主题。默认情况下,输入的每一行都将导致一个单独的事件写入主题。

kafka-console-producer --topic quickstart-events --broker-list cdh1:9092,cdh2:9092,cdh3:9092

结果:

 可以随时使用Ctrl-C停止生产者客户端。

3、从主题(topic)读取事件

打开另一个终端会话并运行控制台消费者客户端以读取刚刚创建的事件:

kafka-console-consumer --topic quickstart-events --from-beginning --bootstrap-server cdh1:9092,cdh2:9092,cdh3:9092

结果:

同样可以通过Ctrl-C停止消费者客户端

如果我们用kafka-console-producer命令再随意写一些事件,消费者客户端会实时出现打印

如果我们再新的会话窗口再启一个消费者客户端呢,会出现如下结果:

为什么新的消费者客户端的打印顺序出现了不同?因为我们有三个分区,如果我们指定分区去消费就会得到顺序的数据

kafka-console-consumer --topic quickstart-events --from-beginning --bootstrap-server cdh1:9092,cdh2:9092,cdh3:9092 --partition 2

结果:

分区0的数据为:This is my first event

分区1的数据为:222

此时我们查看下group的数量,发现是两个,也就是如果我们不指定group,就默认给我们创建一个新的group

kafka-consumer-groups --bootstrap-server cdh1:9092,cdh2:9092,cdh3:9092 --list

结果:

 

4、使用Kafka Connect将数据作为事件流导入/导出

我们可能在关系数据库或传统消息传递系统等现有系统中拥有大量数据,以及已经使用这些系统的许多应用程序。Kafka Connect允许我们不断地将数据从外部系统摄取到Kafka中,反之亦然。它是一个可扩展的工具,运行连接器,实现与外部系统交互的自定义逻辑。因此,将现有系统与Kafka集成非常容易。为了使这一过程更容易,有数百个这样的连接器可供选择。

我们现在使用一个简单的连接器运行Kafka Connect,这些连接器将数据从文件导入Kafka主题并将数据从Kafka主题导出到文件。 

5、使用Kafka Streams 处理事件

一旦你的数据作为事件存储在Kafka中,你就可以使用Java/Scala的Kafka Streams客户端库来处理数据。它允许您实现关键任务实时应用程序和微服务,其中输入和/或输出数据存储在Kafka主题中。Kafka Streams将在客户端编写和部署标准Java和Scala应用程序的简单性与Kafka服务器端集群技术的优势相结合,使这些应用程序具有高度可扩展性、弹性、容错性和分布式。该库支持一次处理、有状态操作和聚合、窗口、连接、基于事件时间的处理等等。

五、总结图

从以上的知识中我们可以总结性的来画下Kafka的认知图

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

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

相关文章

[图形学]蒙特卡洛积分方法介绍及其方差计算

一、简介 本文介绍了蒙特卡洛积分算法的基本原理和其误差计算。 二、蒙特卡洛积分介绍 1. 介绍 蒙特卡洛积分算法是一种数值积分算法,用于对复杂函数进行积分。 例如,对于目标积分函数: ∫ a b f ( x ) d x (1) \int_{a}^{b}f(x)\rm{d}x…

【MySQL】提高篇—索引与性能优化:索引的概念与类型(单列索引、复合索引、全文索引)

在关系数据库中,当表中的数据量增大时,查询性能可能会显著下降。为了提高数据检索的效率,数据库系统提供了索引的概念。 索引类似于书籍的目录,可以快速定位到特定的数据行,从而加快查询速度。 索引的使用在实际应用…

springboot034在线商城系统设计与开发-代码(论文+源码)_kaic

毕 业 设 计(论 文) 题目:ONLY在线商城系统设计与实现 摘 要 现代经济快节奏发展以及不断完善升级的信息化技术,让传统数据信息的管理升级为软件存储,归纳,集中处理数据信息的管理方式。本ONLY在线商城系统…

Dubbo 序列化方式

Hession 这是dubbo的默认序列化协议,是一种二进制协议,他的特点是序列化的速度比较快,并且序列化的数据体积比较小。Hession适合于大部分场景,因此被选为dubbo的默认序列化协议。 Json Json是一种基于文本的序列化方式&#xf…

python+Mosh网课笔记02

太久没写python代码了,学机器学习重新拾起python,笔记比较简陋。 参考:mosh的python教程 目录 一、控制流 二、函数functions 三、数据结构 list stack queue tuple swapping variables array sets dictionary 解包 一、控制流…

机械臂力控方法概述(一)

目录 1. MoveIt 适用范围 2. 力控制框架与 MoveIt 的区别 3. 力控方法 3.1 直接力控制 (Direct Force Control) 3.2 间接力控制 (Indirect Force Control) 3.2.1 柔顺控制 (Compliant Control) 3.2.2 阻抗控制 (Impedance Control) 3.2.3 导纳控制 (Admittance Control…

Wordpress—一个神奇的个人博客搭建框架

wordpress简介 在当今数字化的时代,拥有一个属于自己的个人博客,不仅可以记录生活点滴、分享专业知识,还能展示个人风采。而在众多的博客搭建框架中,Wordpress 以其强大的功能和灵活性脱颖而出。今天,就让我们一起深入…

【秋招笔试】10.13拼多多(已改编)秋招-三语言题解

🍭 大家好这里是 春秋招笔试突围,一起备战大厂笔试 💻 ACM金牌团队🏅️ | 多次AK大厂笔试 | 大厂实习经历 ✨ 本系列打算持续跟新 春秋招笔试题 👏 感谢大家的订阅➕ 和 喜欢💗 和 手里的小花花🌸 ✨ 笔试合集传送们 -> 🧷春秋招笔试合集 🍒 本专栏已收集…

大数据研究实训室建设方案

一、概述 本方案旨在提出一套全面的大数据研究实训室建设策略,旨在为学生打造一个集理论学习与实践操作于一体的高端教育环境。实训室将专注于培养学生在大数据处理、分析及应用领域的专业技能,通过先进的设施配置、科学的课程体系和实用的实训模式&…

红黑树的底层讲解

一、红黑树的介绍 红黑树,是一种二叉搜索树,但在每个结点上增加一个存储位表示结点的颜色,可以是红(red)或黑(black)。通过对任何一条从根到叶子的路径上各个结点着色方式的限制,红…

FLINK SQL语法(1)

DDL Flink SQL DDL(Data Definition Language)是Flink SQL中用于定义和管理数据结构和数据库对象的语法。以下是对Flink SQL DDL的详细解析: 一、创建数据库(CREATE DATABASE) 语法:CREATE DATABASE [IF…

linux环境下的程序设计与git操作

目录 前言: 进度条小程序: 先介绍几个背景知识 代码实现 Git操作 总结 其他指令 前言: 本文将重点介绍1. linux下的程序设计,并使用linux下的几个函数接口。实现一个简单的小程序 2.本着开源精神,进行git操作。…

Vue详细入门(语法【三】)

今天滴的学习目标!!! Vue组件是什么?组件的特性和优势Vue3计算属性Vue3监听属性 在前面Vue详细入门(语法【一】——【二】)当中我们学习了Vue有哪些指令,它的核心语法有哪些?今天我们…

在 javascript 中使用相邻参数作为函数的默认值

更多好文,欢迎关注公众号Geek技术前线 默认参数值在JavaScript中已经存在一段时间了。但其实可以将前面的相邻参数作为默认值本身。 JavaScript自ES2015以来就支持默认参数值,但我们可能不知道的是,我们可以将之前的相邻参数作为默认值 fun…

(AtCoder Beginner Contest 375) 题解(下)

一、题解 第 E 题 3 Team Division 一眼看像背包,观察数据范围,合法的总能力值 ≤ 500 \le 500 ≤500,那么我们可以设计一个背包DP: int dp[110][510][510]; //dp[i][j][k] 表示前 i 个人,分给第一组的能力值是 j&…

微服务架构 --- 使用Seata处理分布式事务

目录 一.Seata 是什么? 1.Seata的核心架构: 2. Seata的分布式事务处理流程: 二.Seata的基本使用: 1.环境准备: 2.引入依赖: 3.加入配置来使用Seata: (1)首先在nacos上添加一…

免费版视频压缩软件:让视频处理更便捷

现在不少人已经习惯通过视频来记录生活、传播信息和进行娱乐的重要方式。但是由于设备大家现在录制的文件都会比较大,这时候就比较需要一些缩小视频的工具了。今天我们一起来探讨视频压缩软件免费版来为我们带来的生动世界。 1.Foxit视频压缩大师 链接直达&#x…

ESP32移植Openharmony外设篇(1)MQ-2烟雾传感器

外设篇 实验箱介绍 旗舰版实验箱由2部分组成:鸿蒙外设模块(支持同时8个工作)、鸿蒙平板。 其中,鸿蒙平板默认采用RK3566方案。 OpenHarmony外设模块采用底板传感器拓展板方式,底板默认采用ESP32方案,也…

青少年编程能力等级测评CPA C++一级试卷(1)

青少年编程能力等级测评CPA C一级试卷(1) 一、单项选择题(共20题,每题3.5分,共70分) CP1_1_1.在C中,下列变量名正确的是( )。 A.$123 B&#…

网络通信与并发编程(三)粘包现象解决方案、socketserver实现并发

粘包现象解决方案、socketserver实现并发 文章目录 粘包现象解决方案、socketserver实现并发一、粘包现象解决方案1.发送数据大小2.发送数据信息 二、socketserver实现并发1.tcp版的socketserver并发2.udp版的socketserver并发 一、粘包现象解决方案 1.发送数据大小 有了上一…