Kafka 基础回顾:Topic、Partition、Producer、Consumer 核心概念
在深入 Kafka 事务与结构化日志集成之前,必须牢固掌握 Kafka 的四大核心抽象:Topic(主题)、Partition(分区)、Producer(生产者) 与 Consumer(消费者)。它们是所有高级特性(包括事务、幂等性、精确一次语义)的基石。
2.1 Topic 与 Partition:日志的分片与有序性
Topic 是 Kafka 中消息的逻辑分类,类似于数据库中的表。每个 Topic 被进一步划分为一个或多个 Partition,Partition 是 Kafka 存储与并行处理的基本单元。
- Partition 内部有序:每个 Partition 是一个追加写入的、不可变的日志序列,消息通过偏移量(Offset)唯一标识,保证分区内严格有序。
- Partition 间无序:不同 Partition 之间不保证全局顺序,跨分区的有序性需要由生产者或消费者自行协调。
- 副本机制:每个 Partition 可以有多个副本(Replica),分布在不同的 Broker 上,提供高可用与故障容错。
关键设计原则:Partition 是 Kafka 水平扩展的最小单位。增加 Partition 数量可以提升并行吞吐量,但也会增加 Leader 选举与元数据管理的开销。建议根据目标吞吐量与消费者组并发数合理设置 Partition 数。
2.2 Producer:消息生产与分区策略
Producer 负责将消息发送到指定的 Topic。其核心职责包括:消息序列化、分区选择、批量发送与确认机制。
| Producer 配置项 | 说明 | 推荐值 |
|---|---|---|
acks |
生产者等待确认的副本数 | all(最强持久性) |
retries |
发送失败后的重试次数 | 3(配合幂等性) |
batch.size |
单个批次的最大字节数 | 16384(16KB) |
linger.ms |
发送前等待更多消息的时间 | 5(毫秒) |
enable.idempotence |
启用幂等性,防止重复写入 | true(事务必需) |
分区策略:默认使用轮询(Round-Robin)或消息键哈希(Key Hash)。事务场景下建议显式指定分区或使用自定义分区器,确保事务协调器能正确管理分区状态。
2.3 Consumer 与 Consumer Group:消费模型与再平衡
Consumer 从 Partition 中拉取消息进行消费。多个 Consumer 可以组成一个 Consumer Group,实现负载均衡与容错。
- 分区分配:每个 Partition 只能被同一个 Group 内的一个 Consumer 消费,保证消息不被重复处理。
- 偏移量提交:Consumer 通过提交 Offset 记录消费进度,支持自动提交与手动提交。
- 再平衡(Rebalance):当 Consumer 加入或离开 Group 时,触发分区重新分配,可能导致短暂消费中断。
事务场景注意:在事务性消费中,必须使用
read_committed 隔离级别,并采用手动提交 Offset 的方式,将 Offset 提交与事务绑定,避免消费未提交的事务消息。
2.4 核心概念对比总结
| 概念 | 角色 | 关键特性 | 事务相关性 |
|---|---|---|---|
| Topic | 消息逻辑分类 | 可配置多个 Partition 与副本 | 事务跨多个 Topic 时需协调 |
| Partition | 存储与并行单元 | 内部有序、不可变日志 | 事务状态存储在 __transaction_state 分区 |
| Producer | 消息生产者 | 支持幂等性、事务、自定义分区 | 事务发起方,需初始化事务 ID |
| Consumer | 消息消费者 | 支持 Group 消费、Offset 管理 | 需使用 read_committed 隔离级别 |
事务集成要点:Kafka 事务机制建立在 Producer 幂等性之上,通过事务协调器(Transaction Coordinator)管理跨 Partition 与跨 Topic 的原子写入。Consumer 必须设置
isolation.level=read_committed 才能只读取已提交的事务消息,避免读到未完成的事务数据。