场景
一、Kafka 是什么?
Apache Kafka 是一个分布式、高吞吐、可持久化、高可用的消息队列 / 事件流平台。
主要用途:
异步解耦:系统之间不直接调用,通过消息通信
削峰填谷:流量突增时缓冲,防止下游被打崩
日志收集 / 数据同步:如用户行为日志、埋点、CDC 数据
实时流处理:配合 Flink、Spark Streaming 做实时计算
特点:
极高吞吐:单机几十万 TPS
消息持久化到磁盘,可重复消费
分布式可扩展,支持多副本高可用
消息顺序性保证
二、核心架构角色
1. Broker
Kafka 服务器节点
一个集群由多个 Broker 组成
负责存储消息、处理读写请求
2. Producer(生产者)
发送消息到 Kafka 的客户端
决定消息发往哪个分区(轮询、哈希、自定义)
3. Consumer(消费者)
从 Kafka 拉取消息的客户端
主动拉取(pull),不是 Kafka 推送
4. Consumer Group(消费者组)
最重要概念之一
一组消费者共同消费一个或多个 Topic
同一个组内,一条消息只会被一个消费者消费
不同组可以重复消费同一条消息
组内消费者数量 ≤ 分区数(多了闲置)
5. Topic(主题)
消息的分类,类似 "消息队列名称"
生产者发往 Topic,消费者订阅 Topic
6. Partition(分区)
核心中的核心
一个 Topic 可以分成多个 Partition
消息被分散存储在不同分区
同一分区内消息严格有序,不同分区不保证全局有序
分区越多,并发消费能力越强
7. Replica(副本)
每个分区可以有多个副本(备份)
分为:
Leader:负责读写
Follower:只同步数据,不对外提供服务
副本机制保证高可用,Leader 挂了 Follower 自动选举新 Leader
8. Offset(偏移量)
消息在分区内的唯一编号,从 0 递增
消费者通过 Offset 标记消费位置
Offset 由消费者自己维护(新版存在 Kafka 内部主题 __consumer_offsets)
三、消息存储机制
消息持久化到磁盘,不是内存
以分段文件存储:.log 数据文件 + .index 索引文件
可设置过期策略(按时间 / 大小删除)
顺序写磁盘,所以极快
四、消费模式
Pull 模式:消费者主动拉取
消费位点自主管理:
自动提交
手动提交(业务更可靠)
三种消费策略:
earliest:从头开始消费
latest:只消费最新消息
none:无位移时报错
五、核心特性
1. 顺序保证
分区内严格有序
想要全局有序:Topic 只设 1 个分区(但失去并发)
2. 高可用
多副本机制
自动故障转移
数据不丢(配置acks=all、min.insync.replicas=2)
3. 高吞吐
批量发送
页缓存 + 零拷贝
顺序写磁盘
4. 可扩展
集群可水平扩容
Topic 可增加分区
5. 消息可靠性
acks 机制:
acks=0:发完不管(最快)
acks=1:Leader 写入即确认
acks=all:所有 ISR 副本写入才确认(最安全)
六、重要进阶概念
1. ISR(In-Sync Replicas)
与 Leader 保持同步的副本集合
只有 ISR 内的副本才有资格被选为新 Leader
防止数据不一致
2. 重平衡(Rebalance)
组内消费者数量变化、分区变化时触发
重新分配分区给消费者
频繁 Rebalance 会影响性能,要避免
3. 事务消息
保证生产者发送多条消息原子性
消费者可设置读已提交模式,避免脏数据
4. 延迟队列 / 死信队列
Kafka 原生不支持延迟队列,但可通过:
多层 Topic + 定时转移
第三方插件实现
消费失败的消息可丢入死信队列(DLQ)
5. 消息回溯
可以重置 Offset,重新消费历史消息
七、和其他 MQ 的简单对比

注:
博客:
https://blog.csdn.net/badao_liumang_qizhi
实现
Windows 本地搭建 Kafka + Zookeeper
- 下载安装 JDK 8+
Kafka 需要 Java 环境,你本地必须装 JDK 并配置好环境变量。
- 下载 Kafka(自带 Zookeeper,不用单独下!)
去官网下载:https://archive.apache.org/dist/kafka/2.8.2/kafka_2.13-2.8.2.tgz
推荐 2.8.2 版本,最稳定、Windows 兼容最好。
下载后解压到一个无中文、无空格的目录
- 修改 Zookeeper 配置
进入上面解压后config目录
打开文件:zookeeper.properties
确认这一行(默认就是对的):
dataDir=/tmp/zookeeper
Windows 可以不改,也能跑。
- 修改 Kafka 配置(必须改!)
打开文件:server.properties
找到并修改两处:
① 日志路径(Windows 必须改)
log.dirs=D:\kafka_2.13-2.8.2\kafka-logs
② 允许外部访问(本地测试必须加)
在文件末尾加:
listeners=PLAINTEXT://:9092
advertised.listeners=PLAINTEXT://localhost:9092
保存即可。
5、启动 Zookeeper(必须先启动!)
打开 CMD 命令行,进入 Kafka 目录
执行启动命令:
bin\windows\zookeeper-server-start.bat config\zookeeper.properties
看到输出:
Started AdminServer on address 0.0.0.0 at port 8080
6、启动 Kafka(第二个 CMD 窗口)
重新开一个新的 CMD,不要关 zk!
进入 Kafka 目录
启动 Kafka:
bin\windows\kafka-server-start.bat config\server.properties
看到:
KafkaServer id=0\] started
7、创建测试主题(必须创建!)
再开一个新 CMD
进入目录
执行创建主题命令:
bin\windows\kafka-topics.bat --create --topic test-topic --bootstrap-server localhost:9092 --partitions 1 --replication-factor 1
看到:
Created topic test-topic.
### SpringBoot 集成 Kafka
SpringBoot 官方提供 Kafka 集成 starter,直接引入即可