在 Kafka 中,Topic(主题) 是消息的逻辑分类单位,相当于一个消息队列的名字。生产者(Producer)将消息写入某个 Topic,消费者(Consumer)则订阅并消费该 Topic 的消息。
1. Topic 的核心概念
-
消息分类容器
-
Kafka 不直接存储"队列",而是通过 Topic 来区分业务数据。
-
举例:日志系统可能有
topic-accesslog
、topic-errorlog
。
-
-
逻辑概念
-
一个 Topic 在物理上由 若干个分区(Partition) 组成。
-
分区中的消息是 有序存储 的,并且每条消息有一个唯一的 偏移量(Offset)。
-
-
多订阅者模型
-
Kafka 允许多个消费者同时订阅同一个 Topic。
-
可以广播消费(多个消费者组独立消费全量数据),也可以组内分摊(一个消费者组内的成员分摊分区)。
-
2. Topic 与 Partition(分区)
-
分区的作用
-
提高 并发度:一个分区只能被同一个消费者组内的一个消费者消费,分区越多,消费者并发能力越强。
-
提高 存储能力:分区可以分布在不同的 Broker 上,提升存储容量和吞吐。
-
-
分区内有序
-
分区内的消息严格按照写入顺序存储和读取。
-
跨分区则不保证全局顺序。
-
-
副本机制(Replication)
-
每个分区都有 Leader 副本 和 Follower 副本。
-
生产者和消费者都与 Leader 副本交互。
-
Follower 负责冗余备份,保证高可用。
-
3. Topic 的配置项
在创建 Topic 时,可以指定配置,比如:
-
分区数(partitions)
--partitions 3
表示该 Topic 拥有 3 个分区。
-
副本因子(replication-factor)
--replication-factor 2
表示每个分区有 2 份副本(1 个 Leader + 1 个 Follower)。
-
保留策略
-
retention.ms
:消息保留的时间,默认 7 天。 -
retention.bytes
:按大小限制 Topic 中消息保留量。 -
cleanup.policy=delete
:过期即删除(默认)。 -
cleanup.policy=compact
:仅保留每个 Key 的最新消息(常用于 KV 场景)。
-
4. Topic 的命令操作
常见操作通过 kafka-topics.sh
完成。
-
创建 Topic
bin/kafka-topics.sh --create \ --bootstrap-server localhost:9092 \ --topic my-topic \ --partitions 3 \ --replication-factor 2
-
查看 Topic 列表
bin/kafka-topics.sh --list --bootstrap-server localhost:9092
-
查看 Topic 详情
bin/kafka-topics.sh --describe \ --bootstrap-server localhost:9092 \ --topic my-topic
-
删除 Topic
bin/kafka-topics.sh --delete \ --bootstrap-server localhost:9092 \ --topic my-topic
5. Topic 的使用场景
-
日志收集系统
- 应用将日志写入
topic-logs
,多个下游系统(存储、监控、实时计算)同时消费。
- 应用将日志写入
-
消息队列替代品
- 下单系统写入
topic-orders
,库存系统、通知系统等分别消费。
- 下单系统写入
-
事件驱动架构(EDA)
- 各类事件(用户登录、下单、支付)写入不同 Topic,供下游业务解耦处理。
6. Topic 的最佳实践
-
分区数量要合理
- 太少会导致吞吐不足,太多则增加管理成本和开销。
-
副本因子建议 ≥2
- 防止单点故障。
-
避免过多小 Topic
- Topic 数量过多会加重 Kafka 的元数据开销。
-
根据业务选择保留策略
- 日志类用
delete
,KV 缓存类用compact
。
- 日志类用
👉 总结:
Kafka 的 Topic 是消息的逻辑分类单元,其本质是由分区和副本组成的分布式日志。它不仅保证消息存储的高吞吐与高可用,还通过消费者组机制支持不同的消费模式。