为什么 Kafka 这么快?它是如何工作的?

随着数据以指数级的速度流入企业,强大且高性能的消息传递系统至关重要。Apache Kafka 因其速度和可扩展性而成为热门选择,但究竟是什么让它如此之快?

在本期中,我们将探讨:

  • Kafka 的架构及其核心组件,如生产者、代理和消费者

  • Kafka 如何优化数据存储和复制

  • 这些优化使 Kafka 能够实现令人印象深刻的吞吐量和低延迟

让我们先深入了解一下 Kafka 的核心组件。

Kafka 架构提炼

在将 Kafka 用作 pub-sub 消息中间件的典型场景中,有 3 个重要组件:生产者、代理者和消费者。生产者是消息发送者,消费者是消息接收者。代理通常以集群模式部署,该模式处理传入的消息并将其写入代理分区,从而允许使用者从中读取数据。

请注意,Kafka 被定位为事件流平台,因此在消息队列中经常使用的术语“消息”在 Kafka 中不使用。我们称之为“事件”。

下图汇集了 Kafka 架构和客户端 API 结构的详细视图。我们可以看到,尽管生产者、消费者和代理仍然是架构的关键,但构建高吞吐量、低延迟的 Kafka 需要更多。让我们一一介绍这些组件。

从高层次的角度来看,体系结构中有两层:计算层和存储层。

计算层

计算层或处理层允许各种应用程序通过 API 与 Kafka 代理进行通信。

生产者使用生产者 API。如果数据库等外部系统想要与 Kafka 通信,它还提供 Kafka Connect 作为集成 API。

消费者通过消费者 API 与经纪人交谈。为了将事件路由到其他数据接收器,如搜索引擎或数据库,我们可以使用 Kafka Connect API。此外,使用者可以使用 Kafka Streams API 执行流式处理。如果我们处理无限的记录流,我们可以创建一个 KStream。下面的代码片段为主题“orders”创建一个 KStream,其中 Serdes(序列化程序和反序列化程序)用于键和值。如果我们只需要更新日志中的最新状态,我们可以创建一个 KTable 来维护状态。Kafka Streams 允许我们对事件流执行聚合、过滤、分组和联接。

final KStreamBuilder builder = new KStreamBuilder();final KStream<String, OrderEvent> orderEvents = builder.stream(Serdes.String(), orderEventSerde, “orders”);

虽然 Kafka Streams API 适用于 Java 应用程序,但有时我们可能希望部署纯流处理作业,而不将其嵌入到应用程序中。然后,我们可以使用 ksqlDB,一个针对流处理优化的数据库集群。它还为我们提供了一个 REST API 来查询结果。

我们可以看到,通过计算层中的各种 API 支持,可以非常灵活地链接我们想要对事件流执行的操作。例如,我们可以订阅主题“orders”,根据产品聚合订单,并将订单计数发送回主题“ordersByProduct”中的 Kafka,另一个分析应用程序可以订阅并显示该主题。

存储层

该层由 Kafka 代理组成。Kafka 代理在服务器集群上运行。数据存储在不同主题的分区中。主题就像一个数据库表,一个主题中的分区可以分布在集群节点上。在分区中,事件严格按其偏移量排序。偏移量表示事件在分区中的位置,并单调增加。代理上持久化的事件是不可变的,并且仅追加,甚至删除也被建模为删除事件。因此,生产者只处理顺序写入,而使用者只按顺序读取。

Kafka 代理的职责包括管理分区、处理读取和写入以及管理分区的复制。它的设计很简单,因此易于扩展。我们将更详细地回顾代理架构。

由于 Kafka 代理是以集群模式部署的,因此管理节点需要两个组件:控制计划和数据平面。

控制平面

控制平面管理 Kafka 集群的元数据。过去是 Zookeeper 管理控制器:一个代理被选为控制器。现在,Kafka 使用一个名为 KRaft 的新模块来实现控制平面。选择一些代理作为控制器。

为什么 Zookeeper 被从集群依赖中剔除?使用 Zookeeper,我们需要维护两种不同类型的系统:一种是 Zookeeper,另一种是 Kafka。使用 KRaft,我们只需要维护一种类型的系统,这使得配置和部署比以前容易得多。此外,KRaft 在将元数据传播到代理方面效率更高。

我们不会在这里讨论 KRaft 共识的细节。需要记住的一点是,控制器和代理中的元数据缓存是通过 Kafka 中的特殊主题同步的。

数据平面处理数据复制。下图显示了一个示例。“orders”主题中的分区 0 在 3 个代理上有 3 个副本。Broker 1 上的分区是主分区,其中当前数据偏移量为 4;代理 2 和 3 上的分区是偏移量位于 2 和 3 处的跟随器。

第 1 步 - 为了赶上领导者,追随者 1 发出偏移量为 2 的 FetchRequest,追随者 2 发出偏移量为 3 的 FetchRequest。

第 2 步 - 然后,领导者将数据相应地发送给两个追随者。

第 3 步 - 由于追随者的请求隐式确认了先前获取的记录的接收,因此领导者随后在偏移量 2 之前提交记录。

记录

Kafka 使用 Record 类作为事件的抽象。无界事件流由许多 Records 组成。

记录中有 4 个部分:

  1. Timestamp 时间戳

  2. Key 键

  3. Value 价值

  4. Headers (optional) 标头(可选)

该密钥用于强制排序、对具有相同密钥的数据进行共置以及数据保留。键和值是字节数组,可以使用序列化程序和解串程序 (serdes) 进行编码和解码。

代理

我们讨论了代理作为存储层。数据按主题进行组织,并作为分区存储在代理上。现在让我们详细了解经纪人是如何工作的。

第 1 步:生产者向代理发送请求,该请求首先进入代理的套接字接收缓冲区。

步骤 2 和 3:其中一个网络线程从套接字接收缓冲区中选取请求,并将其放入共享请求队列中。线程绑定到特定的生产者客户端。

第 4 步:Kafka 的 I/O 线程池从请求队列中获取请求。

步骤 5 和 6:I/O 线程验证数据的 CRC 并将其追加到提交日志中。提交日志在磁盘上按段进行组织。每个段中有两个部分:实际数据和索引。

第 7 步:将生产者请求隐藏在炼狱结构中以进行复制,因此可以释放 I/O 线程来获取下一个请求。

第 8 步:复制请求后,将其从炼狱中删除。 生成响应并将其放入响应队列中。

步骤 9 和 10:网络线程从响应队列中获取响应,并将其发送到相应的套接字发送缓冲区。请注意,网络线程绑定到某个客户端。只有在发出请求的响应后,网络线程才会从特定客户端接收另一个请求。


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

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

相关文章

Xfs文件系统磁盘布局

目录 一&#xff0c;CentOS下Xfs文件系统的安装 二&#xff0c;准备工作 三&#xff0c;AG结构 四&#xff0c;AG超级块 五&#xff0c;AG空闲磁盘空间管理 六&#xff0c;ABTB的Btree 七&#xff0c;ABTB/ABTC的节点块管理 八&#xff0c;inode节点管理 九&#xff0…

【力扣100】34.在排序数组中查找元素的第一个和最后一个位置 || 时间复杂度大小

添加链接描述 class Solution:def searchRange(self, nums: List[int], target: int) -> List[int]:nlen(nums)i,j0,n-1if not n:return [-1,-1]while i<j:midi(j-i)//2if target<nums[mid]:jmid-1elif target>nums[mid]:imid 1else:x,ymid,midwhile x-1>0 and…

Vue-5、el和data的两种写法

1、el 第一种写法 <!DOCTYPE html> <html lang"en" xmlns:v-model"http://www.w3.org/1999/xhtml" xmlns:v-bind"http://www.w3.org/1999/xhtml"> <head><meta charset"UTF-8"><title>el和data的两种写…

vue3中路由的使用(详细讲解)

1、路由的简介 路由(route)&#xff1a;就是根据特定的规则将数据包或请求从源地址传输到目标地址的过程。 在前端或者vue3项目中路由主要用于构建单页面应用程序&#xff08;SPA&#xff09;&#xff0c;其中所有的页面都在同一个HTML文件中加载&#xff0c;通过JavaScript动…

【git使用】常用的 git 撤销操作(restore、reset、revert)

常用命令总结 注意坑 新增文件是未被跟踪状态&#xff08;untracked&#xff09;&#xff0c;也就是下面命令不会对此文件生效所以新增文件&#xff0c;需要先被 git 记录到&#xff0c;也就是 git add new-file之后执行这些操作&#xff0c;就会生效了 # 丢弃工作区的修改&…

自监督深度学习技术

一、定义 自监督学习&#xff08;SSL&#xff09;是机器学习的一种范式&#xff0c;用于处理未标记数据以获取有用的表示&#xff0c;以帮助下游学习任务。SSL方法最显著的特点是它们不需要人类标注的标签&#xff0c;这意味着它的训练完全基于由未标记的数据样本组成的数据集…

网络通信过程的一些基础问题

客户端A在和服务器进行TCP/IP通信时&#xff0c;发送和接收数据使用的是同一个端口吗&#xff1f; 这个问题可以这样来思考&#xff1a;在客户端A与服务器B建立连接时&#xff0c;A需要指定一个端口a向服务器发送数据。当服务器接收到A的报文时&#xff0c;从报文头部解析出A的…

04.循环结构

循环结构 应用场景 我们在写程序的时候&#xff0c;一定会遇到需要重复执行某条或某些指令的场景。例如用程序控制机器人踢足球&#xff0c;如果机器人持球而且还没有进入射门范围&#xff0c;那么我们就要一直发出让机器人向球门方向移动的指令。在这个场景中&#xff0c;让…

018、通用集合类型

Rust标准库包含了一系列非常有用的被称为集合的数据结构。大部分的数据结构都代表着某个特定的值&#xff0c;但集合却可以包含多个值。 与内置的数组与元组类型不同&#xff0c;这些集合将自己持有的数据存储在了堆上。这意味着数据的大小不需要在编译时确定&#xff0c;并且可…

matlab subs 函数计算太慢

来源 计算机器人 transformation matrix 相关内容时&#xff0c;对于关节角度进行离散&#xff0c;循环计算很慢&#xff0c;随着角度划分越来越细&#xff0c;怎么提高速度是一个问题。 最优解决方法 fun_handle matlabFunction(T_t2b_RPY_tmp);T_t2b_RPY_tmp是 transform…

WEB 3D技术 three.js 顶点交换

本文 我们来说 顶点的转换 其实就是 我们所有顶点的位置发生转变 我们整个物体的位置也会随之转变 这里 我们编写代码如下 import ./style.css import * as THREE from "three"; import { OrbitControls } from "three/examples/jsm/controls/OrbitControls.j…

kettle的基本介绍和使用

1、 kettle概述 1.1 什么是kettle Kettle是一款开源的ETL工具&#xff0c;纯java编写&#xff0c;可以在Window、Linux、Unix上运行&#xff0c;绿色无需安装&#xff0c;数据抽取高效稳定。 1.2 Kettle核心知识点 1.2.1 Kettle工程存储方式 以XML形式存储以资源库方式存储…

【数据结构】树的遍历

树的遍历 前序遍历 前序遍历是按照根节点->左子树->右子树的顺序进行遍历 图片来源维基百科深度优先遍历&#xff08;前序遍历&#xff09;: F, B, A, D, C, E, G, I, H. 代码实现 递归 # class TreeNode: # def __init__(self, x): # self.val x # …

Office提示内存或磁盘空间不足

Office提示内存或磁盘空间不足 Office提示内存或磁盘空间不足&#xff0c;可以试试以下方法&#xff0c;不管用不要骂我 打开选项 点击信任中心 在受保护的视图中将以下选项取消勾选后确定&#xff0c;关掉软件重新打开

Java实现责任链模式

责任链模式是一种设计模式&#xff0c;用于处理请求的解耦。在责任链模式中&#xff0c;多个对象都有机会处理请求&#xff0c;从而避免了请求发送者和接收者之间的直接依赖关系。每个处理者都可以决定是否处理请求以及将请求传递给下一个处理者。 简介 责任链模式由一条链组…

服务容错-熔断策略之断路器hystrix-go

文章目录 概要一、服务熔断二、断路器模式三、hystrix-go3.1、使用3.2、源码 四、参考 概要 微服务先行者Martin Fowler与James Lewis在文章microservices中指出了微服务的九大特征&#xff0c;其中一个便是容错性设计(Design for failure)。正如文章中提到的&#xff0c;微服…

Python打印Python环境、PyTorch和CUDA版本、GPU数量名称等信息

代码&#xff1a; import torch import platformgpu_num torch.cuda.device_count() torch_version torch.__version__ python_version platform.python_version()print("Python Version: Python %s" % python_version) print("PyTorch Version: %s" %…

Spring之推断构造方法源码

文章目录 一、 简介1. 内容回顾2. Spring推断构造方法 二、 源码分析 一、 简介 1. 内容回顾 前面分析了Spring的Bean的生命周期的源码&#xff0c;然后分析了依赖注入源码&#xff0c;以及依赖注入的过程中循环依赖Spring的解决方案。在介绍Bean的生命周期中&#xff0c;我们…

三维模型的几何坐标纠正应用探讨

三维模型的几何坐标纠正应用探讨 倾斜摄影三维模型数据的几何坐标纠正应用分析 近年来&#xff0c;倾斜摄影技术在三维数据采集设备中得到广泛应用。倾斜摄影技术通过在飞行平台上搭载多台传感器&#xff0c;从不同角度采集影像&#xff0c;相比传统的摄影测量&#xff0c;倾斜…

每日算法打卡:数的三次方根 day 7

文章目录 原题链接题目描述输入格式输出格式数据范围输入样例&#xff1a;输出样例&#xff1a; 题目分析示例代码 原题链接 790. 数的三次方根 题目难度&#xff1a;简单 题目描述 给定一个浮点数 n&#xff0c;求它的三次方根。 输入格式 共一行&#xff0c;包含一个浮…