Kafka Topic(主题)详解
在 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 是消息的逻辑分类单元,其本质是由分区和副本组成的分布式日志。它不仅保证消息存储的高吞吐与高可用,还通过消费者组机制支持不同的消费模式。