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

相关推荐
材料苦逼不会梦到计算机白富美2 小时前
golang分布式缓存项目 Day 1
分布式·缓存·golang
想进大厂的小王2 小时前
项目架构介绍以及Spring cloud、redis、mq 等组件的基本认识
redis·分布式·后端·spring cloud·微服务·架构
Java 第一深情2 小时前
高性能分布式缓存Redis-数据管理与性能提升之道
redis·分布式·缓存
杨荧3 小时前
【JAVA毕业设计】基于Vue和SpringBoot的服装商城系统学科竞赛管理系统
java·开发语言·vue.js·spring boot·spring cloud·java-ee·kafka
ZHOU西口4 小时前
微服务实战系列之玩转Docker(十八)
分布式·docker·云原生·架构·数据安全·etcd·rbac
zmd-zk4 小时前
kafka+zookeeper的搭建
大数据·分布式·zookeeper·中间件·kafka
激流丶4 小时前
【Kafka 实战】如何解决Kafka Topic数量过多带来的性能问题?
java·大数据·kafka·topic
筱源源4 小时前
Kafka-linux环境部署
linux·kafka
Mephisto.java4 小时前
【大数据学习 | kafka高级部分】kafka中的选举机制
大数据·学习·kafka
Mephisto.java4 小时前
【大数据学习 | kafka高级部分】kafka的优化参数整理
大数据·sql·oracle·kafka·json·database