Kafka消息队列笔记
一、Kafka 核心架构
-
四大组件
-
Producer:发布消息到指定 Topic。
-
Consumer:订阅 Topic 并消费消息(支持消费者组并行)。
-
Broker:Kafka 服务器节点,存储消息,处理读写请求。
-
ZooKeeper/KRaft:集群元数据管理(旧版依赖 ZooKeeper,新版 Kafka 3.0+ 使用 KRaft 模式去 ZooKeeper)。
-
-
核心概念
-
Topic:消息逻辑分类(如
user_events
)。 -
Partition:Topic 的分区(物理分片),消息存储与并行处理的基本单位。
-
每个 Partition 内消息有序(全局无序)。
-
消息通过
offset
唯一标识(分区内自增 ID)。
-
-
Replica:分区副本(Leader 处理读写,Follower 同步备份)。
-
Consumer Group:
-
组内消费者共同消费一个 Topic,每条消息仅被组内一个消费者处理。
-
不同组独立消费同一 Topic(广播场景)。
-
-
二、消息存储机制
-
写操作:
-
消息追加到 Partition 尾部(顺序写磁盘 → 高性能)。
-
存储文件按时间/大小分片(
segment
=.log
+.index
)。
-
-
读操作:
-
通过
offset
直接定位文件位置(index
文件加速查找)。 -
零拷贝(Zero-Copy):减少内核态到用户态数据复制,提升吞吐。
-
三、生产者关键特性
-
消息分发策略
-
默认:
key
的哈希值决定 Partition(相同 Key 发到同一分区 → 保序)。 -
自定义:实现
Partitioner
接口。
-
-
可靠性保证
-
ACKs 机制:
-
acks=0
:不等待确认(可能丢失)。 -
acks=1
:Leader 写成功即确认(默认)。 -
acks=all
:所有 ISR(In-Sync Replicas)副本确认(强一致)。
-
-
重试机制:可配置重试次数(避免网络抖动)。
-
四、消费者关键特性
-
消费模式
-
Pull 模型:消费者主动拉取消息(可控速率)。
-
消费位移(Offset)管理:
-
提交到 Kafka 内部 Topic
__consumer_offsets
。 -
支持自动提交(可能重复消费) vs 手动提交(
commitSync/commitAsync
)。
-
-
-
重平衡(Rebalance)
-
触发条件:消费者加入/退出、Topic 分区数变化。
-
问题:期间服务不可用(通过 Cooperative Sticky Assignor 策略减少影响)。
-
五、高可用与容灾
-
副本同步(ISR):
-
Leader 维护 ISR 列表(同步中的 Follower)。
-
Follower 滞后超过阈值(
replica.lag.time.max.ms
)会被踢出 ISR。
-
-
Leader 选举:
-
从 ISR 中选举新 Leader(避免数据丢失)。
-
-
数据保留策略:
-
基于时间(
log.retention.hours=168
)或大小(log.retention.bytes
)。
-
六、适用场景
-
日志收集:分布式系统日志聚合。
-
流处理:实时计算(配合 Kafka Streams/Flink)。
-
事件驱动架构:微服务间解耦通信。
-
消息缓冲:应对流量峰值(削峰填谷)。
七、性能优化要点
-
吞吐量提升
-
生产者:批量发送(
batch.size
)、压缩(compression.type=lz4
)。 -
消费者:增加分区数(上限受限于 Broker 资源)。
-
-
延迟降低
-
生产者:减少
linger.ms
(非零可提升吞吐但增加延迟)。 -
消费者:减小
fetch.min.bytes
(更快响应,但增加请求次数)。
-
八、常见问题
-
消息重复消费
-
原因:消费者提交 Offset 失败后重试。
-
方案:消费逻辑幂等处理(如数据库唯一键)。
-
-
消息乱序
-
场景:单分区内保序,跨分区不保序。
-
方案:相同 Key 发到同一分区(业务层保序需求)。
-
-
Rebalance 频繁
-
优化:调大
session.timeout.ms
、heartbeat.interval.ms
。
-
九、生态工具
-
Kafka Connect:外部系统数据导入/导出(如 MySQL → Kafka)。
-
Kafka Streams:轻量级流处理库。
-
Schema Registry:管理 Avro/Protobuf 消息格式(解决兼容性)。
十、版本演进重点
-
Kafka 3.0+:KRaft 模式(取代 ZooKeeper,简化部署)。
-
KIP-500:Controller 自管理(提升集群稳定性)。
附:常用命令
# 创建 Topic bin/kafka-topics.sh --create --topic test --partitions 3 --replication-factor 2# 生产者发消息 bin/kafka-console-producer.sh --topic test --bootstrap-server localhost:9092# 消费者收消息 bin/kafka-console-consumer.sh --topic test --group g1 --from-beginning# 查看消费者组位移 bin/kafka-consumer-groups.sh --describe --group g1