深入学习 Kafka(2)- Partition 和 Topic

1. Partition的作用

在这里插入图片描述

Topic是逻辑的概念,Partition是物理的概念:

  • Partition 对一个 Topic 的消息进行物理上的分离,让消息可以分布在不同的实体机器上,可以提升系统吞吐量和并行处理能力。
  • 每个Partition可以有多个副本(Leader和Follower),Leader负责读写操作,Follower负责数据同步。将消息备份在副本中,可以确保高可用性。

举个例子,更形象的理解Partition 和 Topic:

  • Topic 比作高速公路,不同的 Topic就是不同的高速公路
  • Partition 比作车道,有的公路是 3 车道,有的是 4 车道,车道可以提升公路的运输能力

Partition的目的是:通过多Partition实现负载均衡的效果,提高kafka集群的吞吐率。

2. 消息写入Partition

在这里插入图片描述
一个 Topic 有多个 Partition,生产者向一个 Topic 中发送消息的时候,有3种写入方式:

  1. kafka默认轮询规则
  2. producer指定partition key写入特定的partition
  3. producer自定义规则

3. 消息消费

假设主题T1有四个分区。

3.1 一个消费群组

3.1.1 partition数量 > 消费者数量
只有一个消费者时,消费者1将收到所有分区的全部消息。
在这里插入图片描述
当有两个消费者时,每个消费者将分别从两个分区接受消息。
在这里插入图片描述
3.1.2 partition数量 = 消费者数量
当有四个消费者时,每个消费者都可以接受一个分区的消息。
在这里插入图片描述

3.1.3 partition数量 < 消费者数量
当有五个消费者时,会有闲置的消费者。
在这里插入图片描述

3.2 多个消费群组

消费者群组之间是互不影响的:
在这里插入图片描述

4. 分区分配策略

Kafka的分区分配策略决定了如何将Topic的各个Partition分配给消费者组内的消费者,以实现消息的并行消费。这些策略通过配置参数partition.assignment.strategy来指定。主要的分区分配策略包括:

  • RangeAssignor(范围分配器):
    Kafka的默认分区分配策略。它首先将所有Partitions按分区编号排序,然后将消费者按字母顺序排序。之后,将Partitions均匀地“分配”给消费者,尽量使每个消费者分配到连续的Partition区间。这种方式有利于保持消息的顺序性,特别是在消费者组中的消费者数量少于或等于分区数时。
  • RoundRobinAssignor(轮询分配器):
    这种策略将分区在消费者间进行轮询分配,确保每个消费者尽可能平均地获得相同数量的Partitions。相比RangeAssignor,它不保证分区的连续性,但能更好地分散负载,尤其是在消费者数量远大于分区数的情况下。
  • StickyAssignor(粘性分配器 / 粘性分配策略):
    引入于Kafka 0.10.1版本,这是一种更高级的分配策略,旨在结合RangeAssignor和RoundRobinAssignor的优点。它试图在重新平衡时保持分配的稳定性(即尽量保持之前分配给消费者的Partitions不变),同时确保分区尽可能均匀地分布在消费者之间。这种策略减少了频繁的rebalance操作导致的性能开销,提高了整体的稳定性。

5. 分区Rebalance

触发分区分配策略的情景:

  1. 消费者组成员变化:当有新的消费者加入或已有消费者离开消费者组时,会触发重新分配。
  2. 订阅列表变化:如果消费者修改了其订阅的Topic列表,也会引起分配策略的重新执行。
  3. Broker或Partition变化:Kafka集群的Broker增加、减少或Topic的分区数发生变化时,需要重新分配分区。
  4. Session超时:消费者长时间未发送心跳给组协调者(通常由Zookeeper或Kafka自身的GroupCoordinator服务担任),被视为已离线,从而触发再平衡。
  5. 手动触发:在某些情况下,管理员或应用程序可以通过API调用来手动触发消费者的再平衡。

每次触发Rebalance时,Kafka会依据配置的分区分配策略重新计算分区到消费者的映射关系,以达到最佳的负载均衡状态。但是也会消耗大量网络资源和CPU资源,导致在Rebalance期间消费性能下降、集群不稳定,可能导致消息延迟、消息挤压、消息重复消费等异常。为了缓解上述问题,通常采取的措施包括优化Rebalance触发条件、合理配置消费者参数、使用更高效的分区分配策略(如StickyAssignor)、以及确保消费者及时提交偏移量等

### Kafka 初学者指南 Apache Kafka 是一种分布式流处理平台,能够实现高吞吐量的消息传递以及实时数据管道应用程序构建。以下是关于 Kafka 的一些基本概念及其入门方法: #### 什么是 Apache Kafka? Apache Kafka 是由 LinkedIn 开发并于 2011 年开源的一个分布式事件流平台[^1]。它被设计用于高效地处理大规模消息队列,并支持高并发读写操作。 #### Kafka 的核心组件 - **Topic**: 主题是一个逻辑上的分类器,用来区分不同类型的数据流。 - **Producer**: 生产者负责向指定的主题发送消息。 - **Consumer**: 消费者订阅主题并消费其中的消息。 - **Broker**: Kafka 集群中的服务器节点称为 Broker,它们存储生产者的记录并提供给消费者访问。 - **Partition**: Topic 被划分为多个分区 (Partitions),这些分区分布在不同的 Brokers 上以提高性能可靠性。 #### 如何从零开始学习 Kafka? ##### 学习路径建议 1. **理解基础架构**:熟悉 Kafka 的整体结构、其主要组成部分(如 Producer, Consumer, Topics Partitions)的工作原理。 2. **安装与配置 Kafka**:可以通过官方文档下载 Kafka 并设置本地环境来实践基础知识。 3. **编写简单的程序**: - 使用 Java 或其他支持的语言创建一个简单的生产者/消费者应用。 - 下面展示了一个基于 Spring Cloud Stream 构建的简单 Kafka 应用示例: ```java @SpringBootApplication public class KafkaApplication { public static void main(String[] args) { SpringApplication.run(KafkaApplication.class, args); } @Bean public ApplicationRunner runner(MessageChannel output) { return args -> { IntStream.range(0, 10).forEach(i -> output.send(MessageBuilder.withPayload("foo" + i).build())); }; } } ``` 4. **深入研究高级特性**:探索诸如事务、精确一次语义、Kafka Streams API 等更复杂的功能。 5. **部署到生产环境**:尝试将开发的应用程序迁移到 Kubernetes 这样的容器编排平台上运行。 #### 参考资源推荐 对于初学者来说,《Scala Programming For Beginners Complete Guide》虽然专注于 Scala 编程语言的学习[^2],但它也可以作为辅助材料帮助理解如何利用函数式编程风格简化复杂业务逻辑的设计思路;另外还可以关注社区分享的技术博客或者视频教程进一步巩固所学知识点[^3]。
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符  | 博主筛选后可见
 
红包 添加红包
表情包 插入表情
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值