当前位置: 首页 > news >正文

Kafka基本概念

目录

1. 生产者

2. 主题

3. 分区

4. 消费者

5. 消费者组

 消费者组加入和离开消费者组流程

1. 消费者加入消费者组

2. 消费者离开消费者组

批处理

1. 生产者端的批量处理

2. 消费者端的批量处理


Kafka是消息中间件的一种,相较于其他消息中间件,其以极高的吞吐量闻名,常用于构建实时数据管道和流应用,能够处理高吞吐量的数据流。以下是Kafka中的重要概念:

1. 生产者

生产者是向Kafka主题发送消息的客户端。生产者负责将Kafka写入数据,消息的分区策略(如基于消息键、轮询或自定义分区逻辑)以及将数据写入Kafka的哪个主题,这些都由生产者的配置决定来决定。

2. 主题

所有消息中间件都有一种传输消息的结构,kafka中传输消息的结构为主题,消息的传输以主题为单位,由生产者将数据写入特定的主题,在由消费者由特定的主题取出,即可完成一次消息的传输。

3. 分区

为了提高数据进入主题的速度,Kafka将一个主题细分为多个区,每个区都是一个独立的线程,可以独立接受生产者生产的消息,这样大大提高了客户端向Kafka传输数据的速度。

4. 消费者

消费者是从Kafka主题中获取消息的客户端。消费者通常会订阅一个或多个主题,然后从中获取消息并进行处理。消费者可以独立工作,也可以作为消费者组的一部分共同消费数据。

消费者从Kafka消费数据时,获取完数据后,数据并不会消失,消息依旧存储在Kafka主题中。消费者能够在下一次消费时继续消费后续数据,这是得益于Kafka内部维护的特殊主题__consumer_offsets,该主题记录了每个消费者组的分区和其偏移量之间的关系(单个独立的消费者自己属于一个消费者组)。在每次消费之前,消费者会从__consumer_offsets主题中查找自己所属的消费者组的分区的偏移量,并从对应的位置开始消费。消费完成后,消费者会更新这些偏移量并提交到__consumer_offsets主题中。

这也意味着多个消费者组可以同时消费同一个主题而互不干扰,因为每个消费者组在__consumer_offsets主题中都有独立的偏移量记录。因此,即使多个消费者组同时消费同一主题,它们也不会相互影响,各自消费的数据流是独立的。

偏移量是消息在分区中的唯一标识符。每个分区内的消息都有一个连续的偏移量,当消费者从分区中拉取消息时,它会记录已经消费到的最新偏移量,确保下一次消费时能够继续从上次的位置开始。

5. 消费者组

Kafka通过分区提高一个主题数据写入的速度,而消费者组则是Kafka用来提高数据获取速度的手段,消费者组通过建立一个多个消费者的组通过使用__consumer_offsets主题中同一个偏移量,共同消费一个主题,以提高数据消费的速度。

 消费者组加入和离开消费者组流程

1. 消费者加入消费者组

  • 新消费者实例启动:一个新的消费者实例启动,并使用与现有消费者相同的group.id(即消费者组ID)。这个新消费者会向Kafka的消费者组协调器发送一个加入请求,表明它想加入这个消费者组。
  • 分区重新平衡:一旦新的消费者加入,消费者组内的所有分区可能会被重新分配。Kafka会尝试将主题的分区在消费者组中的所有消费者之间重新分配,以平衡负载。例如,如果一个消费者组有6个分区,原本有2个消费者在处理这些分区,Kafka的消费者组协调器会将每三个分区分配给一个消费者,当加入一个新的消费者后,这6个分区就会被重新分配到3个消费者,每个消费者处理2个分区。
  • 新的分配通知:重新平衡后,消费者组协调器会通知每个消费者它现在负责的分区。新加入的消费者会开始从它被分配到的分区中消费消息。

2. 消费者离开消费者组

  • 消费者实例停止:一个消费者实例停止运行、崩溃、或由于网络问题与Kafka断开连接。此时,该消费者将离开消费者组。
  • 分区重新分配:消费者离开消费者组后,消费者组协调器会触发重新平衡过程,将离开消费者原本负责的分区重新分配给剩余的消费者。这确保了所有分区都有消费者来处理。
  • 其他消费者的负载增加:重新平衡后,剩下的消费者会接手离开消费者的分区,从而增加它们的处理负载。

Kafka通过分区和消费者组大大提高了数据写入和读取的速度,除了提高并发以外,吞吐量的提高还要关注带宽和磁盘IO速率,如果网络传输数据或磁盘存取的速度不够快,即使并发量再多,也无法提高性能。但是这两者属于客观因素,kafka本身不能控制,那么kafka如何在固定带宽和磁盘IO速率的情况下,传输更多的数据呢?答案是批处理。

批处理

Kafka为了提高吞吐量,通常会使用**批量处理(batching)**的方式来发送和接收消息。这种机制在生产者和消费者两端都有体现。下面详细解释一下这种机制以及它如何提高Kafka的吞吐量。

1. 生产者端的批量处理

当生产者发送消息时,Kafka允许生产者将多个消息批量打包在一起,然后作为一个单元发送到Kafka。生产者会将消息暂时存储在一个缓冲区中,当缓冲区达到一定的大小(由配置参数决定),或者等待时间达到一个预设的阈值时(如配置的linger.ms参数),生产者会将缓冲区中的消息打包成一个批次,发送到Kafka broker。

通过这种方式,消息一次性发送到服务器,节省了网络请求次数,也节省了磁盘IO过程中的系统调用次数,提高了Kafka的性能。

2. 消费者端的批量处理

在消费者端,Kafka同样允许消费者批量拉取消息,即每次从Kafka broker获取一批消息,而不是每次只获取一条消费者可以设置每次拉取的消息数量上限,从而在单次请求中获得多个消息。

消费者批量拉取数据同样节省网络请求次数,节省磁盘IO过程中的系统调用。

批量处理虽然能够显著提高吞吐量,但也引入了一定的延迟。例如,如果生产者为了等待更多的消息来填满批次而延迟发送,那么这段等待时间会引入额外的延迟。实际生产过程中需要开发者自行调整配置,权衡性能和延迟。

Kafka性能非常优越,但这也意味着它会消耗大量的资源,包括带宽、内存、CPU和磁盘资源。由于Kafka的复杂性和高性能需求,它的运维难度较大,运维人员需要在实际服务器环境中进行配置调整,以适应具体的使用场景和环境。

相关文章:

  • 北京网站建设多少钱?
  • 辽宁网页制作哪家好_网站建设
  • 高端品牌网站建设_汉中网站制作
  • 知乎信息流广告推广开户需要什么资质?
  • uniapp/vue如何实现一个子表单及子表单作用
  • 多核时代下线程间的内存可见性
  • [Meachines] [Easy] granny IIS 6.0+CVE-2017-7269+进程迁移+MS15-051权限提升
  • mov转mp4,这几款软件轻松转换格式!
  • OD C卷 - 幼儿园篮球游戏
  • 实现Kruskal算法连通游戏地图地牢
  • RTA-VRTE适配Orin
  • pdf查看密码
  • Android 14适配
  • Swift 6.0 如何更优雅的抛出和处理特定类型的错误
  • 每日一问:为什么MySQL索引使用B+树? 第4版 (含时间复杂度对比表格)
  • JVM感知docker容器内存资源限制
  • Blender----利用DEM(tif)生成三维模型
  • 解读红外控制遥控器原理!!!
  • 【Linux系统编程】快速查找errno错误码信息
  • 3.7、@ResponseBody 和 @RestController
  • Android 初级面试者拾遗(前台界面篇)之 Activity 和 Fragment
  • Django 博客开发教程 8 - 博客文章详情页
  • Javascript 原型链
  • Java多态
  • JS 面试题总结
  • js递归,无限分级树形折叠菜单
  • k8s如何管理Pod
  • Next.js之基础概念(二)
  • 从重复到重用
  • 浏览器缓存机制分析
  • 你不可错过的前端面试题(一)
  • 七牛云 DV OV EV SSL 证书上线,限时折扣低至 6.75 折!
  • 如何用vue打造一个移动端音乐播放器
  • 我从编程教室毕业
  • 鱼骨图 - 如何绘制?
  • 源码之下无秘密 ── 做最好的 Netty 源码分析教程
  • MyCAT水平分库
  • UI设计初学者应该如何入门?
  • (1)Map集合 (2)异常机制 (3)File类 (4)I/O流
  • (22)C#传智:复习,多态虚方法抽象类接口,静态类,String与StringBuilder,集合泛型List与Dictionary,文件类,结构与类的区别
  • (第27天)Oracle 数据泵转换分区表
  • (第一天)包装对象、作用域、创建对象
  • (分类)KNN算法- 参数调优
  • (附源码)计算机毕业设计SSM智慧停车系统
  • (转)jdk与jre的区别
  • (转)PlayerPrefs在Windows下存到哪里去了?
  • (转)机器学习的数学基础(1)--Dirichlet分布
  • (转载)hibernate缓存
  • .NET 3.0 Framework已经被添加到WindowUpdate
  • .NET Core 2.1路线图
  • .NET Core MongoDB数据仓储和工作单元模式封装
  • .NET/C# 的字符串暂存池
  • .netcore 如何获取系统中所有session_ASP.NET Core如何解决分布式Session一致性问题
  • .net开发引用程序集提示没有强名称的解决办法
  • .NET框架
  • .NET企业级应用架构设计系列之结尾篇
  • .NET与java的MVC模式(2):struts2核心工作流程与原理
  • @staticmethod和@classmethod的作用与区别