Kafka基本概念

目录

[1. 生产者](#1. 生产者)

[2. 主题](#2. 主题)

[3. 分区](#3. 分区)

[4. 消费者](#4. 消费者)

[5. 消费者组](#5. 消费者组)

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

[1. 消费者加入消费者组](#1. 消费者加入消费者组)

[2. 消费者离开消费者组](#2. 消费者离开消费者组)

批处理

[1. 生产者端的批量处理](#1. 生产者端的批量处理)

[2. 消费者端的批量处理](#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的复杂性和高性能需求,它的运维难度较大,运维人员需要在实际服务器环境中进行配置调整,以适应具体的使用场景和环境。

相关推荐
初晴~1 小时前
【Redis分布式锁】高并发场景下秒杀业务的实现思路(集群模式)
java·数据库·redis·分布式·后端·spring·
有一个好名字1 小时前
zookeeper分布式锁模拟12306买票
分布式·zookeeper·云原生
漫无目的行走的月亮2 小时前
Ubuntu下C语言操作kafka示例
kafka·librdkafka
yukai080085 小时前
【最后203篇系列】002 - 两个小坑(容器时间错误和kafka模块报错
分布式·kafka
老猿讲编程6 小时前
OMG DDS 规范漫谈:分布式数据交互的演进之路
分布式·dds
C++忠实粉丝6 小时前
服务端高并发分布式结构演进之路
分布式
洛神灬殇7 小时前
彻底认识和理解探索分布式网络编程中的SSL安全通信机制
网络·分布式·ssl
龙哥·三年风水7 小时前
workman服务端开发模式-应用开发-vue-element-admin封装websocket
分布式·websocket·vue
李洋-蛟龙腾飞公司10 小时前
HarmonyOS Next 应用元服务开发-分布式数据对象迁移数据文件资产迁移
分布式·华为·harmonyos
技术路上的苦行僧13 小时前
分布式专题(10)之ShardingSphere分库分表实战指南
分布式·shardingsphere·分库分表