Kafka 分区

news2024/11/28 12:50:59

分区是 Kafka 的核心功能,对于 Kafka 的存储结构、消息的生产消费方式都至关重要。

Partition(分区)

每 topic 都可以分成多分区,每个分区都是一组有序的、不可变的记录序列,每个分区在存储层面是 append log 文件。

分区中的每一条消息数据都被赋予了一个连续的数字ID,即偏移量 (offset) ,用于唯一标识分区中的每条消息数据,任何发布到此分区的消息都会被直接追加到 log 文件的尾部。

  

为什么要进行分区?

既然 Topic 已经对消息进行了分类,为什么每个 Topic 内部还需要再次分区?

topic 是逻辑的概念,partition 是物理的概念。 

最根本的原因就是 kafka 基于文件进行存储,当文件内容大到一定程度时,很容易大到单个磁盘的上限。如果没有分区,一个 topic 对应的消息集在分布式集群服务组中,就会分布不均匀,可能导致某台服务器消息堆积,吞吐也容易导致瓶颈。

有了分区后,kafka 内部会根据一定的算法把分区数尽可能均匀分布到不同的服务器上,比如:服务器1负责 topic 的分区0,服务器2负责 topic 的分区1,生产者发送消息时若没指定发送到哪个分区的时候,kafka 就会根据一定算法均匀分布到不同的服务器上。

所以,分区的目的是通过多分区实现负载均衡的效果,提高 kafka 访问吞吐率。

Kafka分区策略

Kafka 默认分区策略同时实现了两种策略:

  • 不指定Key:则使用轮询策略
  • 指定Key:默认实现按消息键策略

轮询策略

轮询策略,即顺序分配策略。轮询策略是 Kafka 默认提供的分区策略,有非常优秀的负载均衡表现,能保证消息最大限度地被平均分配到所有分区上。

按消息键策略

Kafka 允许为每条消息定义消息键,简称为 key。一旦消息被定义了 key,就可以保证同一个 key 的所有消息都进入到相同的分区中。

消息顺序性

使用 kafka 发送的消息如果没有顺序上的约束的话,那么在一个 topic 的不同 partition 之间就是水平扩展关系。只是多几个并行的消息通道而已。直接传递消息(V)即可。

如果将 Topic 设置成单分区,该 Topic 的所有的消息都只在一个分区内读写,保证全局的顺序性,但将丧失 Kafka 多分区带来的高吞吐量和负载均衡的性能优势。

多分区消息保序的方法是按消息键策略,同一 key 的消息都会发送到同一分区,kafka 的 broker 进程会保证 producer 推送消息的顺序。既可以保证分区内的消息顺序,也可以实现多分区带来的高吞吐量。

发送消息的时候,可以指定一个分区 key,这样就可以写入特定分区了。分区 key 会通过 Hash 计算结果决定写入哪个分区,有相同分区 key 的消息,会被放到相同的分区中。一个分区可能会有不同的 K,且不同的 K 是交叉排列的,相同的 K 在一个分区没有排列在一起。虽然是和其他 K 交叉排列的,但是顺序还是一样的。consumer 通过 K 去区分同一种需要顺序性的消息,从而能按照原有顺序去消费。

如果没有使用分区 key,Kafka 就会使用轮询的方式来决定写入哪个分区中。这样,消息会均衡的写入各个分区,这样无法确保消息的有序性。

注意

  • 如果在多分区消息保序的场景一下业务上也有关联必须由一个 producer 去 push ,因为一个 producer 内部才能去保证消息有序性。
  • 消息重试只是简单将消息重新发送到原来的分区,不会重新选择分区。

消费消息

Kafka 不会向消费者推送消息,消费者必须自己从 Topic 的分区中拉取消息。

kafka 只能保证分区内有序,无法保证分区间有序,所以消费时数据是无序的。

如果增加分区时,分区内的消息不会重新进行分配,随着数据继续写入,新分区才会参与再平衡。

偏移量 (Offset)

一个分区对应一个磁盘上的文件,分区中的每条记录都会被分配一个唯一的序号,称为 Offset(偏移量)。

Offset 是一个递增的、不可变的数字,由 Kafka 自动维护。当一条记录写入分区时,它就被追加到 log 文件的末尾,并被分配一个序号,作为 Offset。在 kafka 中几乎不允许对消息进行“随机读写”,文件只能顺序的读写。

一个 Topic 如果有多个分区的话的情况下,那么从 Topic 这个层面来看,消息是无序的。

若单独看分区的情况下,分区内部消息是有序的。所以,一个分区内部消息有序,一个 Topic 跨分区是无序的。

如果强制要求 Topic 整体有序,就只能让 Topic 只有一个分区。

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

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

相关文章

python中Requests发送json格式的post请求方法

问题:做requests请求时遇到如下报错: {“code”:“500”,“message”:"JSON parse error: Cannot construct instance of com.bang.erpapplication.domain.User (although at least one Creator exists): no String-argument constructor/factory …

唠一唠程序员的那些事

作为一名互联网摸爬滚打多年的老兵,我可以从以下角度提供一些信息: 加班是家常便饭:程序员往往需要加班来满足项目需求或完成任务。这意味着他们经常会在晚上、周末或节假日工作。代码不仅仅是工作:对于大多数程序员来说&#xff…

【C++】成员对象和成员函数分开存储

欢迎来到博主 Apeiron 的博客,祝您旅程愉快 ! 时止则止,时行则行。动静不失其时,其道光明。 目录 1、缘起 2、详解 3、代码清单 1 3.1、类中定义成员变量 3.2、类中定义成员函数 4、代码清单 2 5、总结 1、缘起 “成员变量…

SpringBoot 增强Controller方法,@ControllerAdvice注解的使用

参考资料 ControllerAdvice 用法SpringBoot使用ControllerAdvice注解 目录 一. ControllerAdvice注解作用二. ControllerAdvice注解 assignableTypes属性2.1 ControllerAdvice增强类2.2 Controller层2.3 效果 三. ControllerAdvice注解 basePackages属性3.1 ControllerAdvic…

踩坑|以为是Redis缓存没想到却是Spring事务!

前言 最近碰到了一个Bug,折腾了我好几天。并且这个Bug不是必现的,出现的概率比较低。一开始我以为是旧数据的问题,就让测试重新生成了一下数据,重新测试。由于后面几轮测试均未出现,我也就没太在意。 可惜好景不长&…

【LeetCode】260. 只出现一次的数字 III

260. 只出现一次的数字 III(中等) 思路 这道题是136. 只出现一次的数字 的进阶版,需要找出两个仅出现一次的元素。有了上一题的基础,我们很容易就想到要用异或来解决,但是由于这题最终会剩下两个不同的元素&#xff0…

设置和使用DragGAN:搭建非官方的演示版

DragGAN的官方版还没有发布,但是已经有非官方版的实现了,我们看看如何使用。DragGAN不仅让GAN重新回到竞争轨道上,而且为GAN图像处理开辟了新的可能性。正式版本将于本月发布。但是现在已经可以在一个非官方的演示中试用这个新工具了 DragGAN…

数据结构:二叉树(初阶)

朋友们、伙计们,我们又见面了,本期来给大家解读一下二叉树方面的相关知识点,如果看完之后对你有一定的启发,那么请留下你的三连,祝大家心想事成! C 语 言 专 栏:C语言:从入门到精通 …

Unix/C/C++进阶--SocketCAN 编程

Unix/C/C进阶--SocketCAN 编程 1 介绍1.1 socketcan 简介1.2 can 发展历程1.3 can总线优点 2 知识点2.1 CAN详解--书籍、网站2.2 CAN详解--CAN与com口介绍2.3 CAN详解--各家CAN分析仪与软件的比较2.4 转载:CAN总线终端电阻2.5 如何破解汽车--CAN协议(can…

3.8 电路布线

博主简介:一个爱打游戏的计算机专业学生博主主页: 夏驰和徐策所属专栏:算法设计与分析 1.最优子结构的证明: 我的理解: 对于电路布线问题的最优子结构性质,我们可以通过数学推导进行证明。下面是对证明的…

conda在 powershell下不能激活虚拟环境

这里写自定义目录标题 问题原因解决办法增加环境变量修改PowerShell 策略初始化conda环境安装或更新conda 结果 问题原因 powershell正常是不行的,但是在cmd中是可以的 问题产生的原因有很多: 必须无法识别activate.bat激活无反应 解决办法 增加环…

【JavaSE】Java基础语法(四十六):枚举

文章目录 1. 概述2. 定义格式3. 枚举的特点4. 枚举的方法 1. 概述 枚举是一种特殊的数据类型,它列出了一组预定义的常量,并使用标识符来引用这些常量。枚举的用途很广泛,下面列举了几个常见的应用场景: 管理常量:如果您…

计算机组成原理---第三章存储系统 习题详解版

(一)精选课内习题 3.1 3.2 3.3 3.4 3.5 3.6 3.7 3.8 (二)精选课后习题 1.设有一个具有20位地址和32位字长的存储器,问: (1)该存储器能存储多少个字节的信息? (2)如果存储器由512k8位的SR…

Linux :: vim 编辑器:详解:文本复制/粘贴/剪切/删除 与 撤销普通操作及撤销撤销操作

前言:本篇是 Linux 基本操作篇章的内容! 笔者使用的环境是基于腾讯云服务器:CentOS 7.6 64bit。 学习集: C 入门到入土!!!学习合集Linux 从命令到网络再到内核!学习合集 前文&#x…

chatgpt赋能python:Python去掉None:提高代码效率,优化SEO

Python去掉None:提高代码效率,优化SEO 作为一名有10年Python编程经验的工程师,我发现Python中会频繁出现None类型的变量。这种情况在代码中一旦过多,就会影响程序的效率,同样也会影响SEO的排名。因此,为提…

【数据仓库架构】什么是 Azure Synapse,它与 Azure Data Bricks 有何不同?

Azure Synapse Analytics 是一项针对大型公司的无限信息分析服务,它被呈现为 Azure SQL 数据仓库 (SQL DW) 的演变,将业务数据存储和宏或大数据分析结合在一起。 在处理、管理和提供数据以满足即时商业智能和数据预测需求时,Synapse 为所有工…

Hive学习---5、文件格式和压缩、企业级调优

1、文件格式和压缩 1.1 Hadoop压缩概述 由于Hive是相当于与Hadoop的客户端,所以hadoop会啥压缩,Hive基本就会啥压缩。 压缩格式算法文件扩展名是否可切分DEFLATEDEFLATE.deflate否GzipDEFLATE.gz否bzip2bzip2.bz2是LZOLZO.lzo是SnappySnappy.snappy否…

word恢复和粘贴按钮变灰色,不可用怎么办?

如果 Word 中的恢复和粘贴按钮变成灰色,可能是由于以下原因之一: 1. 文档处于只读模式。 2. 与 Office 相关的某些组件已损坏或缺失。 3. Word 的文件权限被配置为只读。 以下是一些可能的解决方法: 1. 检查文档是否处于只读模式。 如果是…

随机数发生器设计(三)

随机数发生器设计(三)- 熵估计和健康测试 熵估计健康测试 熵估计 考虑都熵源的多样性,建立一个通用的熵估计模型比较困难。本文采用nist.sp.800-90B推荐的Markov评估。详见 https://doi.org/10.6028/NIST.SP.800-90B。 执行Markov评估时&am…

chatgpt赋能python:用Python向手机发送信息是如何实现的?

用Python向手机发送信息是如何实现的? 在今天的信息时代,随时随地保持联系已经成为生活不可或缺的一部分。随着技术的发展,我们可以使用各种方式发送和接收信息,而使用Python向手机发送短信是其中一种非常方便的方式。 Python的…