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的复杂性和高性能需求,它的运维难度较大,运维人员需要在实际服务器环境中进行配置调整,以适应具体的使用场景和环境。

相关推荐
武子康21 分钟前
Java-72 深入浅出 RPC Dubbo 上手 生产者模块详解
java·spring boot·分布式·后端·rpc·dubbo·nio
橘子在努力4 小时前
【橘子分布式】Thrift RPC(理论篇)
分布式·网络协议·rpc
lifallen6 小时前
Kafka 时间轮深度解析:如何O(1)处理定时任务
java·数据结构·分布式·后端·算法·kafka
沈健_算法小生8 小时前
基于SpringBoot3集成Kafka集群
分布式·kafka·linq
Swift社区9 小时前
ELK、Loki、Kafka 三种日志告警联动方案全解析(附实战 Demo)
分布式·elk·kafka
chanalbert17 小时前
Nacos 技术研究文档(基于 Nacos 3)
spring boot·分布式·spring cloud
线条119 小时前
Spark 单机模式安装与测试全攻略
大数据·分布式·spark
C182981825751 天前
分布式ID 与自增区别
分布式
码字的字节1 天前
深入解析Hadoop架构设计:原理、组件与应用
大数据·hadoop·分布式·hadoop架构设计
悟能不能悟1 天前
Dubbo跨越分布式事务的最终一致性陷阱
分布式·wpf·dubbo