Kafka概念
一、核心组件对照表
组件 | 定义 | 主要功能 | 特点 |
---|---|---|---|
Broker | Kafka集群中的服务器节点 | 存储消息、处理请求、管理分区 | 唯一ID,可能成为Controller |
Topic | 消息的逻辑分类单元 | 消息分类、存储组织 | 包含多个Partition,类似数据库表 |
Partition | Topic的物理分片 | 并行处理、数据分布 | 有序队列,不可变,有offset |
Offset | 消息在分区中的位置标识 | 追踪消费进度 | 单调递增,支持随机访问 |
Replica | 分区的备份 | 数据备份、故障转移 | 包括Leader和Follower |
二、客户端组件表
组件 | 定义 | 主要功能 | 特点 |
---|---|---|---|
Producer | 消息生产者 | 发送消息、分区策略 | 支持同步/异步,可指定key |
Consumer | 消息消费者 | 消费消息、维护offset | 可订阅多个Topic |
Consumer Group | 消费者逻辑分组 | 负载均衡、分区分配 | 组内分区独占消费 |
单分区场景下的消费组和消费者
1. 单分区场景
Topic: order_topic (单分区)
└── Partition 0 (消息1,2,3,4,5...)│├── ConsumerGroup1 (订单系统)│ └── Consumer1 (工作) --> 串行消费消息1,2,3,4,5...│ └── Consumer2 (空闲,无法分配分区)│ └── Consumer3 (空闲,无法分配分区)│├── ConsumerGroup2 (统计系统)│ └── Consumer1 (工作) --> 串行消费相同的消息1,2,3,4,5...│ └── Consumer2 (空闲,无法分配分区)│└── ConsumerGroup3 (日志系统)└── Consumer1 (工作) --> 串行消费相同的消息1,2,3,4,5...└── Consumer2 (空闲,无法分配分区)
多分区场景下的消费组和消费者
Topic: order_topic (3个分区)
├── Partition 0 (消息1,4,7...)
│ ├── ConsumerGroup1
│ │ └── Consumer1 (工作) --> 消费消息1,4,7...
│ ├── ConsumerGroup2
│ │ └── Consumer1 (工作) --> 消费相同的消息1,4,7...
│ └── ConsumerGroup3
│ └── Consumer1 (工作) --> 消费相同的消息1,4,7...
│
├── Partition 1 (消息2,5,8...)
│ ├── ConsumerGroup1
│ │ └── Consumer2 (工作) --> 消费消息2,5,8...
│ ├── ConsumerGroup2
│ │ └── Consumer2 (工作) --> 消费相同的消息2,5,8...
│ └── ConsumerGroup3
│ └── Consumer2 (工作) --> 消费相同的消息2,5,8...
│
└── Partition 2 (消息3,6,9...)├── ConsumerGroup1│ └── Consumer3 (工作) --> 消费消息3,6,9...├── ConsumerGroup2│ └── Consumer3 (工作) --> 消费相同的消息3,6,9...└── ConsumerGroup3└── Consumer3 (工作) --> 消费相同的消息3,6,9...
三、集群管理组件表
组件 | 定义 | 主要功能 | 特点 |
---|---|---|---|
Controller | 特殊的Broker角色 | Leader选举、监控状态 | 集群只有一个活跃Controller |
ISR | 同步副本集合 | 保证数据一致性 | 包含Leader和同步的Follower |
四、场景举例表(程序考虑)
场景 | 实现方式 | 优点 | 注意事项 |
---|---|---|---|
消息查找 | 基于Key | 保证顺序性,相同key到同分区 | 可能导致数据倾斜 |
基于时间 | 支持历史数据查询 | 性能较低 | |
基于Offset | 精确定位 | 需要记录offset | |
外部索引 | 支持复杂查询 | 需要额外存储 |
五、实践总结与分析
1. 分区与副本分布示例
集群规模:3个Broker
Topic配置:3个分区,复制因子3分区分布示例:
Partition 0:Leader(Broker1),Follower(Broker2,Broker3)
Partition 1:Leader(Broker2),Follower(Broker3,Broker1)
Partition 2:Leader(Broker3),Follower(Broker1,Broker2)
2. 关键特性分析
- 分区分配:均匀分布在所有Broker上
- 副本策略:
- 每个分区的Leader优先在首选Broker上
- Follower按照优化后的顺序分布在其他Broker上
- 保证副本均匀分布,提高可用性
3. 消费模式分析
- 单Consumer Group:
- 最多支持3个消费者(等于分区数,个人环境也是3个)
- 超过3个消费者会有消费者空闲
- 多Consumer Group:
- 每个Group都可以有最多3个消费者
- 各Group独立消费,不互相影响
- 实现消息的广播效果
多场景举例说明
例如:有一个Topic (order_topic),3个分区
│
├── 分区0
├── 分区1
└── 分区2场景A:单Consumer Group
ConsumerGroup1:
├── Consumer1 --> 消费分区0
├── Consumer2 --> 消费分区1
└── Consumer3 --> 消费分区2
└── Consumer4 --> 空闲(因为没有更多分区可分配)场景B:多Consumer Group
ConsumerGroup1:
├── Consumer1 --> 消费分区0
├── Consumer2 --> 消费分区1
└── Consumer3 --> 消费分区2ConsumerGroup2:(同时独立消费相同的数据)
├── Consumer1 --> 消费分区0
├── Consumer2 --> 消费分区1
└── Consumer3 --> 消费分区2
Topic: order_topic (3个分区)// 场景1:订单处理系统(负载均衡)
ConsumerGroup: order_processing
- Consumer1: 处理分区0的订单
- Consumer2: 处理分区1的订单
- Consumer3: 处理分区2的订单
结果:每个订单只被处理一次,实现负载均衡// 场景2:多系统数据同步(广播)
ConsumerGroup1: order_system
- Consumer1-3: 消费订单数据写入订单系统ConsumerGroup2: statistics_system
- Consumer1-3: 同样的数据写入统计系统ConsumerGroup3: log_system
- Consumer1-3: 同样的数据写入日志系统
结果:同一条消息被多个系统处理,实现数据广播
总结
1、分区数决定单个Consumer Group内最大的并行消费者数
2、Consumer Group提供了两种消费模式:
- 单Group:负载均衡模式(消息只被处理一次)
- 多Group:广播模式(同一消息被多个系统处理)
4. 消息查找策略(程序考虑)
- Key-Based查找:
- 相同key路由到固定分区
- 适合需要顺序性的场景
- 时间查找:
- 支持按时间戳查找
- 适合历史数据分析
- Offset查找:
- 精确定位消息位置
- 适合消息重放场景
- 外部索引:
- 维护消息元数据
- 支持复杂查询需求